ZIP(ファイル形式)とは
ZIPはロスレスデータ圧縮をサポートするアーカイブファイル形式です。ZIPファイルには、圧縮された1つ以上のファイルやディレクトリが含まれることがあります。ZIPファイルは通常、拡張子 .zip または .ZIP を使用し、MIMEタイプは application/zip です。多くのプログラムがベースファイル形式としてZIPを使用しており、名前は異なることがあります。ユーザーインターフェイスでファイルシステムを操作するとき、ZIPファイルを表すグラフィックアイコンは、ジッパーが目立つ文書やオブジェクトとして表示されることが多いです。
ファイルをZIP(圧縮)する複数の方法
があり、使用するオペレーティングシステムによって異なります。ほぼ毎日、ファイルをZIPまたは解凍してストレージサーバーやファイル共有プラットフォームに転送する必要があります。幸い、Aspose.ZIP API
を使用すれば、このプロセスを自動化できます。基礎となるファイル構造を気にせずに、ファイルの圧縮と解凍が可能です。本記事では、単一ファイルおよび複数ファイルの圧縮方法を紹介します。
Aspose.ZIP パッケージは、次の NuGet コマンドで .NET プロジェクトに追加できます。
PM> Install-Package Aspose.Zip
C#で単一ファイルを圧縮する方法
- まず、出力 ZIP アーカイブ用に FileStream クラス
のオブジェクトを作成する必要があります。
- 単一ファイルを FileStream
オブジェクトにロードします。
- Archive クラス
のオブジェクトを作成します。
Archive.CreateEntry("FileName", FileStream) メソッドを使用してファイルをアーカイブに追加します。
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");
}
encryptionSettings パラメータは、パスワードで保護された ZIP アーカイブを作成するために使用されます。
C#でパスワード付きZIPファイルを解凍する
using (var archive = new Archive("input_archive.zip", new ArchiveLoadOptions{DecryptionPassword = "pass"}))
{
archive.ExtractToDirectory("\\outputDirectory");
}
ArchiveLoadOptions の DecryptionPassword プロパティは、パスワードで保護された ZIP アーカイブを開く際に使用されます。
完全なサンプルとデータファイルを見るには、https://github.com/aspose-zip/Aspose.ZIP-for-.NET にアクセスしてください。
ZIPアーカイブ内でのLZMA圧縮の使用
Lempel–Ziv–Markov chain アルゴリズム(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圧縮の使用
Partial Matching による予測(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 にアクセスしてください。