Ja

KNOWLEDGEBASE

C# を使用してファイルを圧縮または解凍する - ファイルの圧縮と解凍

ZIPとは(ファイル形式)

ZIP は、ロスレス データ圧縮をサポートするアーカイブ ファイル形式です。 ZIP ファイルには、圧縮されている可能性がある 1 つ以上のファイルまたはディレクトリが含まれている場合があります。 ZIP ファイルは通常、ファイル拡張子 .zip または .ZIP と MIME メディア タイプ application/zip を使用します。 ZIP は、多くのプログラムでベース ファイル形式として使用されますが、通常は別の名前で使用されます。 ユーザー インターフェイスを介してファイル システムをナビゲートする場合、ZIP ファイルを表すグラフィック アイコンは、多くの場合、ジッパーが目立つドキュメントまたはその他のオブジェクトとして表示されます。 ファイルを圧縮 (圧縮) する複数の方法 は、使用しているオペレーティング システムによって異なります。 そしてほぼ毎日、いくつかのファイルを圧縮または解凍し、それらをストレージ サーバーまたはファイル共有プラットフォームに転送することになっています。 幸いなことに、 Aspose.ZIP API を使用してそのプロセスを自動化できます。 基になるファイル構造を気にすることなく、ファイルを圧縮および解凍できます。 この記事では、単一ファイル圧縮と複数ファイル圧縮の操作について説明します。 Aspose.ZIP パッケージは、次の NuGet コマンドを使用して .NET プロジェクトに追加できます。

PM> Install-Package Aspose.Zip

C# で単一のファイルを圧縮する方法

  1. まず、出力 ZIP アーカイブ用の FileStream クラス のオブジェクトを作成する必要があります。
  2. FileStream オブジェクトに 1 つのファイルをロードします。
  3. アーカイブクラスのオブジェクトを作成する
  4. Archive.CreateEntry( “FileName”, FileStream) メソッドを使用してファイルをアーカイブに追加します。
  5. Archive.Save(FileStream) メソッドを使用して ZIP アーカイブを作成します。
        using (FileStream zipFile = File.Open(dataDir + "CompressSingleFile_out.zip", FileMode.Create))
        {
            //File to be added to archive
            using (FileStream source1 = File.Open(dataDir + "alice29.txt", FileMode.Open, FileAccess.Read))
            {
                    using (var archive = new Archive(new ArchiveEntrySettings()))
                {
                    archive.CreateEntry("alice29.txt", source1);
                    archive.Save(zipFile);
                }
            }
        }

C# で複数のファイルを圧縮する

単一ファイルと複数ファイルの圧縮の違いは、より多くのファイルを FileStream にロードし、メソッド Archive.CreateEntry(“FileName”, FileStream) を使用してそれらすべてを ZIP アーカイブに追加する必要があることです。 次のコード スニペットは、FileStream を使用して複数のファイルを ZIP に追加する方法を示しています。

        // Create FileStream for output ZIP archive
        using (FileStream zipFile = File.Open("compressed_files.zip", FileMode.Create))
        {
	        // File to be added to archive
	        using (FileStream source1 = File.Open("alice29.txt", FileMode.Open, FileAccess.Read))
	            {
		            // File to be added to archive
		            using (FileStream source2 = File.Open("asyoulike.txt", FileMode.Open, FileAccess.Read))
		        {
			        using (var archive = new Archive())
			            {
				            // Add files to the archive
				            archive.CreateEntry("alice29.txt", source1);
				            archive.CreateEntry("asyoulik3.txt", source2);
				            // ZIP the files
				            archive.Save(zipFile, new ArchiveSaveOptions() { Encoding = Encoding.ASCII, ArchiveComment = "two files are compressed in this archive" });
		            	}
		        }
	        }
        }

FileInfo クラスを使用してファイルを圧縮する

FileInfo クラスを使用してファイルをロードし、後で以前と同じ方法で ZIP アーカイブに追加することもできます。 FileInfo クラスは、ファイルの作成、コピー、削除、移動、および開くためのプロパティとインスタンス メソッドを提供し、FileStream オブジェクトの作成を支援します。

    using (FileStream zipFile = File.Open("compressed_files.zip", FileMode.Create))
    {
	    // Files to be added to archive
	    FileInfo fi1 = new FileInfo("alice29.txt");
	    FileInfo fi2 = new FileInfo("fields.c");
	    using (var archive = new Archive())
	        {
		        // Add files to the archive
		        archive.CreateEntry("alice29.txt", fi1);
		        archive.CreateEntry("fields.c", fi2);
		        // Create ZIP archive
		        archive.Save(zipFile, new ArchiveSaveOptions() { Encoding = Encoding.ASCII });
	        }
    }

圧縮せずにファイルをアーカイブに保存する

    //Creates zip archive without compressing files
    using (FileStream zipFile = File.Open(dataDir + "StoreMultipleFilesWithoutCompression_out.zip", FileMode.Create))
    {
    FileInfo fi1 = new FileInfo(dataDir + "alice29.txt");
    FileInfo fi2 = new FileInfo(dataDir + "lcet10.txt");

    using (Archive archive = new Archive(new ArchiveEntrySettings(new StoreCompressionSettings())))
    {
        archive.CreateEntry("alice29.txt", fi1);
        archive.CreateEntry("lcet10.txt", fi2);
        archive.Save(zipFile, new ArchiveSaveOptions() { Encoding = Encoding.ASCII });
    }
    }  

C# でパスワード付きのファイルを ZIP する方法

    using (var archive = new Archive(new ArchiveEntrySettings(encryptionSettings: new TraditionalEncryptionSettings("pass"))))
    {
    archive.CreateEntry("entry_name1.dat", "input_file1.dat");
    archive.CreateEntry("entry_name2.dat", "input_file2.dat");
    archive.Save("result_archive.zip");
    }

パスワードで保護された ZIP アーカイブを作成するには、encryptionSettings パラメータを使用します。

C# でパスワード付きのファイルを解凍する方法

    using (var archive = new Archive("input_archive.zip", new ArchiveLoadOptions{DecryptionPassword = "pass"}))
    {
    archive.ExtractToDirectory("\\outputDirectory");
    }

DecryptionPassword プロパティ値を持つ ArchiveLoadOptions は、パスワードで保護された ZIP アーカイブを開くために使用されます。 完全な例とデータ ファイルを表示するには、https://github.com/aspose-zip/Aspose.ZIP-for-.NET にアクセスしてください。

ZIP アーカイブ内での LZMA 圧縮の使用

Lempel–Ziv–Markov 連鎖アルゴリズム (LZMA) は、ロスレス データ圧縮を実行するために使用されるアルゴリズムです。 LZMA は辞書圧縮アルゴリズムを使用します。圧縮されたストリームはビットのストリームです。 ZIP アーカイブ内の LZMA 圧縮により、ZIP コンテナに LZMA 圧縮エントリを含めることができます。 次のコード例は、 Aspose.ZIP API を使用した LZMA 圧縮の実装を示しています。

using (FileStream zipFile = File.Open(dataDir + "LZMACompression_out.zip", FileMode.Create))
{
    using (Archive archive = new Archive(new ArchiveEntrySettings(new LzmaCompressionSettings())))
    {
        archive.CreateEntry("sample.txt", dataDir + "sample.txt");
        archive.Save(zipFile);
    }
}

ZIP アーカイブ内での BZip2 圧縮の使用

bzip2 は、Burrows–Wheeler アルゴリズムを使用する無料のオープンソース ファイル圧縮プログラムです。 単一のファイルのみを圧縮し、ファイル アーカイバではありません。 Julian Seward によって開発され、Mark Wielaard と Micah Snyder によって保守されています。 次のコード スニペットは、 Aspose.ZIP API を使用した BZip2 圧縮の実装を示しています。

using (FileStream zipFile = File.Open(dataDir + "Bzip2Compression_out.zip", FileMode.Create))
{
    using (Archive archive = new Archive(new ArchiveEntrySettings(new Bzip2CompressionSettings())))
    {
        archive.CreateEntry("sample.txt", dataDir + "sample.txt");
        archive.Save(zipFile);
    }
}

ZIP アーカイブ内での PPMd 圧縮の使用

部分一致による予測 (PPM) は、コンテキスト モデリングと予測に基づいた適応統計データ圧縮手法です。 PPM モデルは、圧縮されていないシンボル ストリーム内の以前のシンボルのセットを使用して、ストリーム内の次のシンボルを予測します。 PPM アルゴリズムは、クラスター分析でデータを予測グループにクラスター化するためにも使用できます。 次のコード スニペットは、 Aspose.ZIP API を使用した PPMd 圧縮の実装を示しています。

using (FileStream zipFile = File.Open(dataDir + "PPMdCompression_out.zip", FileMode.Create))
{
    using (Archive archive = new Archive(new ArchiveEntrySettings(new PPMdCompressionSettings())))
    {
        archive.CreateEntry("sample.txt", dataDir + "sample.txt");
        archive.Save(zipFile);
    }
}

単一ファイルでアーカイブを解凍

using (FileStream fs = File.OpenRead(dataDir + "CompressSingleFile_out.zip"))
{
    using (Archive archive = new Archive(fs))
    {
        int percentReady = 0;
        archive.Entries[0].ExtractionProgressed += (s, e) =>
        {
            int percent = (int)((100 * e.ProceededBytes) / ((ArchiveEntry)s).UncompressedSize);
            if (percent > percentReady)
            {
                Console.WriteLine(string.Format("{0}% decompressed", percent));
                percentReady = percent;
            }
        };
        archive.Entries[0].Extract(dataDir + "alice_extracted_out.txt");
    }
}

複数のファイルを含むアーカイブを解凍する

using (FileStream zipFile = File.Open(dataDir + "CompressMultipleFiles_out.zip", FileMode.Open))
{
    StringBuilder sb = new StringBuilder("Entries are: ");
    int percentReady = 0;
    using (Archive archive = new Archive(zipFile,
        new ArchiveLoadOptions()
        {
            EntryListed = (s, e) => { sb.AppendFormat("{0}, ", e.Entry.Name); },
            EntryExtractionProgressed = (s, e) =>
            {
                int percent = (int)((100 * e.ProceededBytes) / ((ArchiveEntry)s).UncompressedSize);
                if (percent > percentReady)
                {
                    Console.WriteLine(string.Format("{0}% compressed", percent)); percentReady = percent;
                }
            }
        }))
    {
        Console.WriteLine(sb.ToString(0, sb.Length - 2));
        using (var extracted = File.Create(dataDir + "alice_extracted_out.txt"))
        {
            using (var decompressed = archive.Entries[0].Open())
            {
                byte[] buffer = new byte[8192];
                int bytesRead;
                while (0 < (bytesRead = decompressed.Read(buffer, 0, buffer.Length)))
                {
                    extracted.Write(buffer, 0, bytesRead);
                }
                // Read from decompressed stream to extracting file.
            }
        }
        percentReady = 0;
        archive.Entries[1].Extract(dataDir + "asyoulik_extracted_out.txt");
    }
}

保存されたアーカイブを圧縮せずに抽出する

using (FileStream zipFile = File.Open(dataDir + "StoreMultipleFilesWithoutCompression_out.zip", FileMode.Open))
{
    using (Archive archive = new Archive(zipFile))
    {
        using (var extracted = File.Create(dataDir + "alice_extracted_store_out.txt"))
        {
            using (var decompressed = archive.Entries[0].Open())
            {
                byte[] buffer = new byte[8192];
                int bytesRead;
                while (0 < (bytesRead = decompressed.Read(buffer, 0, buffer.Length)))
                {
                    extracted.Write(buffer, 0, bytesRead);
                }
                // Read from decompressed stream to extracting file.
            }
        }

        using (var extracted = File.Create(dataDir + "asyoulik_extracted_store_out.txt"))
        {
            using (var decompressed = archive.Entries[1].Open())
            {
                byte[] buffer = new byte[8192];
                int bytesRead;
                while (0 < (bytesRead = decompressed.Read(buffer, 0, buffer.Length)))
                {
                    extracted.Write(buffer, 0, bytesRead);
                }
                // Read from decompressed stream to extracting file.
            }
        }
    }
}

完全なサンプルとデータ ファイルについては、https://github.com/aspose-zip/Aspose.ZIP-for-.NET にアクセスしてください。