.NET でファイルを圧縮または解凍する

概要

この記事では、C# または .NET API とサンプル コードを利用したさまざまな方法を使用して、プログラムで Zip ファイルを圧縮する方法を説明します。 1 つまたは複数のファイルを zip または圧縮する方法、およびファイルを同時に zip 圧縮する方法を学習します。ファイルを解凍または解凍する方法も学びます。

C# でファイルを圧縮または圧縮し、C# でファイルを解凍または解凍します

Aspose.ZIP API を使用すると、基礎となるファイル構造を気にせずにファイルを圧縮および解凍できます。この記事では、単一ファイル圧縮と複数ファイル圧縮の操作について説明します。

ファイルの圧縮

単一ファイルの圧縮

手順: C# で単一ファイルを圧縮する

  1. 出力 zip ファイルの目的の名前を使用して ファイル ストリーム を作成します。
  2. 圧縮するデータファイルのファイルストリームを作成します。
  3. Archive クラスのインスタンスを作成し、それに ArchiveEntrySettings クラスのインスタンスを渡します。
  4. Archive.CreateEntryメソッドを使用して、手順2で作成したデータファイルを追加します。
  5. Archive.Save メソッドを使用してデータ ファイルを圧縮し、手順 1 で作成したファイル ストリームに渡します。
 1    // For complete examples and data files, please go to https://github.com/aspose-zip/Aspose.ZIP-for-.NET
 2    using (FileStream zipFile = File.Open(dataDir + "CompressSingleFile_out.zip", FileMode.Create))
 3    {
 4        //File to be added to archive
 5        using (FileStream source1 = File.Open(dataDir + "alice29.txt", FileMode.Open, FileAccess.Read))
 6        {
 7            using (var archive = new Archive(new ArchiveEntrySettings()))
 8            {
 9                archive.CreateEntry("alice29.txt", source1);
10                
11                archive.Save(zipFile);
12            }
13        }
14    }

複数のファイルの圧縮

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

  1. 出力 zip ファイルの目的の名前を持つファイル ストリームを作成します。
  2. 圧縮する最初のデータファイルのファイルストリームを作成します。
  3. 圧縮する 2 番目のデータ ファイルのファイル ストリームを作成します。
  4. Archive クラスのインスタンスを作成します。
  5. Archive.CreateEntryメソッドを使用して、手順2と手順3で作成したデータファイルを追加します。
  6. ArchiveSaveOptions クラスのインスタンスを作成します。
  7. Archive.Save メソッドを使用してデータ ファイルを圧縮し、手順 1 で作成したファイル ストリームと、上記の手順で作成した ArchiveSaveOptions のインスタンスを渡します。
 1    // For complete examples and data files, please go to https://github.com/aspose-zip/Aspose.ZIP-for-.NET
 2    using (FileStream zipFile = File.Open(dataDir + "CompressMultipleFiles_out.zip", FileMode.Create))
 3    {
 4        using (FileStream source1 = File.Open(dataDir + "alice29.txt", FileMode.Open, FileAccess.Read))
 5        {
 6            using (FileStream source2 = File.Open(dataDir + "asyoulik.txt", FileMode.Open, FileAccess.Read))
 7            {
 8                using (var archive = new Archive())
 9                {
10                    archive.CreateEntry("alice29.txt", source1);
11                    archive.CreateEntry("asyoulik.txt", source2);
12                    archive.Save(zipFile, new ArchiveSaveOptions() { Encoding = Encoding.ASCII, ArchiveComment = "There are two poems from Canterbury corpus" });
13                }
14            }
15        }
16    }
17    

ファイル情報に基づいてファイルを圧縮

手順: ファイル情報に基づいてファイルを圧縮するC# で

  1. FileMode.Create を使用して、出力 zip ファイルの目的の名前を付けてファイル ストリームを開きます。
  2. 圧縮する最初のデータ ファイルの FileInfo オブジェクトを作成します。
  3. 圧縮する 2 番目のデータ ファイルの FileInfo オブジェクトを作成します。
  4. Archive クラスのインスタンスを作成します。
  5. Archive.CreateEntryメソッドを使用して、手順2と手順3で作成したデータファイルを追加します。
  6. ArchiveSaveOptions クラスのインスタンスを作成します。
  7. Archive.Save メソッドを使用してデータ ファイルを圧縮し、手順 1 で作成したファイル ストリームと、上記の手順で作成した ArchiveSaveOptions のインスタンスを渡します。
 1    // For complete examples and data files, please go to https://github.com/aspose-zip/Aspose.ZIP-for-.NET
 2    using (FileStream zipFile = File.Open(dataDir + "CompressFilesByFileInfo_out.zip", FileMode.Create))
 3    {
 4        FileInfo fi1 = new FileInfo(dataDir + "alice29.txt");
 5        FileInfo fi2 = new FileInfo(dataDir + "fields.c");
 6
 7        using (var archive = new Archive())
 8        {
 9            archive.CreateEntry("alice29.txt", fi1);
10            archive.CreateEntry("fields.c", fi2);
11            archive.Save(zipFile, new ArchiveSaveOptions() { Encoding = Encoding.ASCII });
12        }
13    }
14    

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

手順: 保存C# を使用してファイルを圧縮せずにアーカイブする1. FileMode.Create を使用して、出力 zip ファイルの目的の名前を付けてファイル ストリームを開きます。 2. アーカイブに保存するデータ ファイルの FileInfo オブジェクトを作成します。 3. ArchiveEntrySettings クラスのインスタンスを作成し、それに StoreCompressionSettings クラスのインスタンスを渡します。 4. Archive クラスのインスタンスを作成し、上記の手順で作成した ArchiveEntrySettings クラスのインスタンスを渡します。 5. Archive.CreateEntry メソッドを使用して、手順 2 で作成した FileInfo オブジェクトを追加します。 6. ArchiveSaveOptions のインスタンスを作成し、Encoding = Encoding.ASCII を設定します。 7. Archive.Save メソッドを使用してデータ ファイルを圧縮し、手順 1 で作成したファイル ストリームと、上記の手順で作成した ArchiveSaveOptions のインスタンスを渡します。

 1    // For complete examples and data files, please go to https://github.com/aspose-zip/Aspose.ZIP-for-.NET
 2    //Creates zip archive without compressing files
 3    using (FileStream zipFile = File.Open(dataDir + "StoreMultipleFilesWithoutCompression_out.zip", FileMode.Create))
 4    {
 5        FileInfo fi1 = new FileInfo(dataDir + "alice29.txt");
 6        FileInfo fi2 = new FileInfo(dataDir + "lcet10.txt");
 7
 8        using (Archive archive = new Archive(new ArchiveEntrySettings(new StoreCompressionSettings())))
 9        {
10            archive.CreateEntry("alice29.txt", fi1);
11            archive.CreateEntry("lcet10.txt", fi2);
12            archive.Save(zipFile, new ArchiveSaveOptions() { Encoding = Encoding.ASCII });
13        }
14
15    }
16    

並列処理を使用したファイルの圧縮

手順: 並列処理を使用してファイルを圧縮するC# を使用

  1. FileMode.Create を使用して、出力 zip ファイルの目的の名前を付けてファイル ストリームを開きます。
  2. 圧縮する 1 番目と 2 番目のデータ ファイルに対して、FileMode.OpenFileAccess.Read を使用してファイル ストリームを開きます。
  3. Archive クラスのインスタンスを作成します。
  4. Archive.CreateEntryメソッドを使用して、手順2で作成したデータファイルを追加します。
  5. ParallelOptions のインスタンスを作成し、ParallelCompressInMemory = ParallelCompressionMode.Always を設定します。
  6. ArchiveSaveOptions のインスタンスを作成し、そのプロパティ ParallelOptions を上記のインスタンスで設定します。
  7. Archive.Save メソッドを使用してデータ ファイルを圧縮し、手順 1 で作成したファイル ストリームと、上記の手順で作成した ArchiveSaveOptions のインスタンスを渡します。
 1    // For complete examples and data files, please go to https://github.com/aspose-zip/Aspose.ZIP-for-.NET
 2    using (FileStream zipFile = File.Open(dataDir + "UsingParallelismToCompressFiles_out.zip", FileMode.Create))
 3    {
 4        using (FileStream source1 = File.Open(dataDir + "alice29.txt", FileMode.Open, FileAccess.Read))
 5        {
 6            using (FileStream source2 = File.Open(dataDir + "asyoulik.txt", FileMode.Open, FileAccess.Read))
 7            {
 8                using (var archive = new Archive())
 9                {
10                    archive.CreateEntry("alice29.txt", source1);
11                    archive.CreateEntry("asyoulik.txt", source2);
12                    //Define the parallelism criterion
13                    var parallelOptions = new ParallelOptions
14                    {
15                        ParallelCompressInMemory = ParallelCompressionMode.Always
16                    };
17                    archive.Save(zipFile,
18                        new ArchiveSaveOptions()
19                        {
20                            ParallelOptions = parallelOptions,
21                            Encoding = Encoding.ASCII,
22                            ArchiveComment = "There are two poems from Canterbury corpus"
23                        });
24                }
25            }
26        }
27    }
28    

ZIP アーカイブ内の LZMA 圧縮

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

手順: ZIP アーカイブ内での LZMA 圧縮C# を使用

  1. FileMode.Create を使用して、出力 zip ファイルの目的の名前を付けてファイル ストリームを開きます。
  2. ArchiveEntrySettings のインスタンスを作成し、それを LzmaCompressionSettings クラスのインスタンスに渡します。
  3. Archive クラスのインスタンスを作成し、上で作成した ArchiveEntrySettings のインスタンスに渡します。
  4. Archive.CreateEntryメソッドを使用して、ファイルパス経由で圧縮するデータファイルを追加します。
  5. Archive.Save メソッドを使用してデータ ファイルを圧縮します。
1    using (FileStream zipFile = File.Open(dataDir + "LZMACompression_out.zip", FileMode.Create))
2    {
3        using (Archive archive = new Archive(new ArchiveEntrySettings(new LzmaCompressionSettings())))
4        {
5            archive.CreateEntry("sample.txt", dataDir + "sample.txt");
6            archive.Save(zipFile);
7        }
8    }

ZIP アーカイブ内の BZip2 圧縮

BZip2 圧縮設定により、ZIP コンテナに BZip2 圧縮エントリを含めることができます。 次のコード例は、Aspose.ZIP API を使用した BZip2 圧縮の実装を示しています。

手順: ZIP アーカイブ内での BZip2 圧縮C# を使用

  1. FileMode.Create を使用して、出力 zip ファイルの目的の名前を付けてファイル ストリームを開きます。
  2. ArchiveEntrySettings のインスタンスを作成し、それを Bzip2CompressionSettings クラスのインスタンスに渡します。
  3. Archive クラスのインスタンスを作成し、上で作成した ArchiveEntrySettings のインスタンスに渡します。
  4. Archive.CreateEntryメソッドを使用して、ファイルパス経由で圧縮するデータファイルを追加します。
  5. Archive.Save メソッドを使用してデータ ファイルを圧縮します。
1    using (FileStream zipFile = File.Open(dataDir + "Bzip2Compression_out.zip", FileMode.Create))
2    {
3        using (Archive archive = new Archive(new ArchiveEntrySettings(new Bzip2CompressionSettings())))
4        {
5            archive.CreateEntry("sample.txt", dataDir + "sample.txt");
6            archive.Save(zipFile);
7        }
8    }    
9        

ZIP アーカイブ内の PPMd 圧縮

PPMd 圧縮設定により、ZIP コンテナに PPMd 圧縮エントリを含めることができます。 次のコード例は、Aspose.ZIP API を使用した PPMd 圧縮の実装を示しています。

手順: ZIP アーカイブ内での PPMd 圧縮C# を使用

  1. FileMode.Create を使用して、出力 zip ファイルの目的の名前を付けてファイル ストリームを開きます。
  2. ArchiveEntrySettings のインスタンスを作成し、それを PPMdCompressionSettings クラスのインスタンスに渡します。
  3. Archive クラスのインスタンスを作成し、上で作成した ArchiveEntrySettings のインスタンスに渡します。
  4. Archive.CreateEntryメソッドを使用して、ファイルパス経由で圧縮するデータファイルを追加します。
  5. Archive.Save メソッドを使用してデータ ファイルを圧縮します。
1    using (FileStream zipFile = File.Open(dataDir + "PPMdCompression_out.zip", FileMode.Create))
2    {
3        using (Archive archive = new Archive(new ArchiveEntrySettings(new PPMdCompressionSettings())))
4        {
5            archive.CreateEntry("sample.txt", dataDir + "sample.txt");
6            archive.Save(zipFile);
7        }
8    }    
9        

アーカイブの解凍

単一ファイルを含むアーカイブを解凍します

手順: C# を使用してアーカイブから単一ファイルを解凍します。

  1. FileMode.OpenRead を使用して、入力 ZIP ファイルのファイル ストリームを開きます。
  2. ファイル ストリームをコンストラクターに渡して、Archive クラスのインスタンスを作成します。
  3. アーカイブ エントリの ExtractionProgressed イベントを使用して、解凍の進行状況を監視します。
  4. Extract メソッドを使用して、出力ファイルのパスを指定して、アーカイブから 1 つのファイルを抽出します。
  5. コンソールに解凍の進行状況をパーセンテージで表示します。
 1    // For complete examples and data files, please go to https://github.com/aspose-zip/Aspose.ZIP-for-.NET
 2    using (FileStream fs = File.OpenRead(dataDir + "CompressSingleFile_out.zip"))
 3    {
 4        using (Archive archive = new Archive(fs))
 5        {
 6            int percentReady = 0;
 7            archive.Entries[0].ExtractionProgressed += (s, e) =>
 8            {
 9                int percent = (int)((100 * e.ProceededBytes) / ((ArchiveEntry)s).UncompressedSize);
10                if (percent > percentReady)
11                {
12                    Console.WriteLine(string.Format("{0}% decompressed", percent));
13                    percentReady = percent;
14                }
15            };
16            archive.Entries[0].Extract(dataDir + "alice_extracted_out.txt");
17        }
18    }    
19        

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

手順: C# を使用してアーカイブから複数のファイルを解凍します< /strong>

  1. FileMode.Open を使用して、入力 ZIP ファイルのファイル ストリームを開きます。
  2. エントリをリストし、解凍の進行状況を追跡するためのカスタム ロード オプションを使用して Archive クラスのインスタンスを作成します。
  3. EntryListed イベントを使用して、すべてのアーカイブ エントリの名前を表示します。
  4. EntryExtractionProgressed イベントを使用して解凍の進行状況を監視し、コンソールに進行状況を表示します。
  5. Extract メソッドを使用して、データを出力ファイルに読み取り、アーカイブから複数のファイルを抽出します。
 1    // For complete examples and data files, please go to https://github.com/aspose-zip/Aspose.ZIP-for-.NET
 2    using (FileStream zipFile = File.Open(dataDir + "CompressMultipleFiles_out.zip", FileMode.Open))
 3    {
 4        StringBuilder sb = new StringBuilder("Entries are: ");
 5        int percentReady = 0;
 6        using (Archive archive = new Archive(zipFile,
 7            new ArchiveLoadOptions()
 8            {
 9                EntryListed = (s, e) => { sb.AppendFormat("{0}, ", e.Entry.Name); },
10                EntryExtractionProgressed = (s, e) =>
11                {
12                    int percent = (int)((100 * e.ProceededBytes) / ((ArchiveEntry)s).UncompressedSize);
13                    if (percent > percentReady)
14                    {
15                        Console.WriteLine(string.Format("{0}% compressed", percent)); percentReady = percent;
16                    }
17                }
18            }))
19        {
20            Console.WriteLine(sb.ToString(0, sb.Length - 2));
21            using (var extracted = File.Create(dataDir + "alice_extracted_out.txt"))
22            {
23                using (var decompressed = archive.Entries[0].Open())
24                {
25                    byte[] buffer = new byte[8192];
26                    int bytesRead;
27                    while (0 < (bytesRead = decompressed.Read(buffer, 0, buffer.Length)))
28                    {
29                        extracted.Write(buffer, 0, bytesRead);
30                    }
31                    // Read from decompressed stream to extracting file.
32                }
33            }
34            percentReady = 0;
35            archive.Entries[1].Extract(dataDir + "asyoulik_extracted_out.txt");
36        }
37    }    
38        

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

手順: アーカイブからファイルを抽出してディスクに保存するC# を使用

  1. ZIP ファイルを開き、Archive クラスのインスタンスを作成します。
  2. エントリのストリームを開いてその内容を新しいファイルに書き込むことにより、アーカイブから最初のファイルを抽出します。
  3. バッファを使用して、解凍されたストリームからデータを読み取り、出力ファイルに保存します。
  4. アーカイブ内の 2 番目のファイルに対してこのプロセスを繰り返し、その内容を別の出力ファイルに書き込みます。
 1    // For complete examples and data files, please go to https://github.com/aspose-zip/Aspose.ZIP-for-.NET
 2    using (FileStream zipFile = File.Open(dataDir + "StoreMultipleFilesWithoutCompression_out.zip", FileMode.Open))
 3    {
 4        using (Archive archive = new Archive(zipFile))
 5        {
 6            using (var extracted = File.Create(dataDir + "alice_extracted_store_out.txt"))
 7            {
 8                using (var decompressed = archive.Entries[0].Open())
 9                {
10                    byte[] buffer = new byte[8192];
11                    int bytesRead;
12                    while (0 < (bytesRead = decompressed.Read(buffer, 0, buffer.Length)))
13                    {
14                        extracted.Write(buffer, 0, bytesRead);
15                    }
16                    // Read from decompressed stream to extracting file.
17                }
18            }
19
20            using (var extracted = File.Create(dataDir + "asyoulik_extracted_store_out.txt"))
21            {
22                using (var decompressed = archive.Entries[1].Open())
23                {
24                    byte[] buffer = new byte[8192];
25                    int bytesRead;
26                    while (0 < (bytesRead = decompressed.Read(buffer, 0, buffer.Length)))
27                    {
28                        extracted.Write(buffer, 0, bytesRead);
29                    }
30                    // Read from decompressed stream to extracting file.
31                }
32            }
33        }
34    }    
35        
Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.