C#でZIPを作成する

ZIPアーカイブは、1つ以上のファイルまたはフォルダーを1つのコンテナーに圧縮して保持するために使用されます。 ZIPアーカイブは、ファイルとフォルダーをカプセル化し、それらのメタデータ情報を保持します。アーカイブの最も一般的な使用法は、ストレージまたは送信用のファイルのサイズを縮小し、セキュリティのために暗号化を適用することです。ファイル圧縮ツールとは別に、自動圧縮/抽出機能は、ファイルのアップロード、ダウンロード、共有、または暗号化のために、さまざまなデスクトップおよびWebアプリケーション内でも使用されます。この記事も同様のシナリオを対象としており、C#を使用してプログラムでファイルまたはフォルダーを圧縮し、ZIPアーカイブを作成する簡単な方法をいくつか紹介します。

この記事では、次のZIPアーカイブ操作を実行する方法を学習します。

前提条件-C#ZIPライブラリ

Aspose.ZIP for .NETは、.NETアプリケーション内のファイルやフォルダーを圧縮または解凍するための強力で使いやすいAPIです。また、ZIPアーカイブ内のファイルを暗号化するためのAES暗号化技術も提供します。 NuGetからAPIをインストールするか、ダウンロードセクションからそのバイナリをダウンロードできます。

C#でZIPアーカイブを作成する

ファイルをZIPアーカイブに追加して圧縮する手順は次のとおりです。

  • 出力ZIPアーカイブ用のFileStreamオブジェクトを作成します。
  • ソースファイルをFileStreamオブジェクトに開きます。
  • Archiveクラスのオブジェクトを作成します。
  • Archive.CreateEntry(string, FileStream)メソッドを使用して、ファイルをアーカイブに追加します。
  • Archive.Save(FileStream)メソッドを使用してZIPアーカイブを作成します。

次のコードサンプルは、C#を使用してファイルをZIPアーカイブに追加する方法を示しています。

// 出力ZIPアーカイブ用のFileStreamを作成します
using (FileStream zipFile = File.Open("compressed_file.zip", FileMode.Create))
{
	// アーカイブに追加するファイル
	using (FileStream source1 = File.Open("alice29.txt", FileMode.Open, FileAccess.Read))
	{
		using (var archive = new Archive(new ArchiveEntrySettings()))
		{
			// アーカイブにファイルを追加する
			archive.CreateEntry("alice29.txt", source1);
			// ZIPファイル
			archive.Save(zipFile);
		}
	}
}

C#のZIPアーカイブに複数のファイルを追加する

複数のファイルをZIPアーカイブに追加する場合は、次のいずれかの方法を使用して追加できます。

FileStreamを使用して複数のファイルをZIPする

このメソッドでは、FileStreamクラスを使用して、Archive.CreateEntry(string, FileStream)メソッドを使用してZIPアーカイブにファイルを追加します。次のコードサンプルは、C#で複数のファイルをZIPに追加する方法を示しています。

// 出力ZIPアーカイブ用のFileStreamを作成します
using (FileStream zipFile = File.Open("compressed_files.zip", FileMode.Create))
{
	// アーカイブに追加するファイル
	using (FileStream source1 = File.Open("alice29.txt", FileMode.Open, FileAccess.Read))
	{
		// アーカイブに追加するファイル
		using (FileStream source2 = File.Open("asyoulike.txt", FileMode.Open, FileAccess.Read))
		{
			using (var archive = new Archive())
			{
				// アーカイブにファイルを追加する
				archive.CreateEntry("alice29.txt", source1);
				archive.CreateEntry("asyoulik3.txt", source2);
				// ファイルをZIPする
				archive.Save(zipFile, new ArchiveSaveOptions() { Encoding = Encoding.ASCII, ArchiveComment = "two files are compressed in this archive" });
			}
		}
	}
}

FileInfoを使用して複数のファイルをZIPする

FileInfoクラスを使用して、ZIPアーカイブに複数のファイルを追加することもできます。このメソッドでは、ファイルはFileInfoクラスを使用してロードされ、Archive.CreateEntry(string, FileInfo)メソッドを使用してZIPアーカイブに追加されます。次のコードサンプルは、C#でFileInfoクラスを使用して複数のファイルをZIPする方法を示しています。

// 出力ZIPアーカイブ用のFileStreamを作成します
using (FileStream zipFile = File.Open("compressed_files.zip", FileMode.Create))
{
	// アーカイブに追加するファイル
	FileInfo fi1 = new FileInfo("alice29.txt");
	FileInfo fi2 = new FileInfo("fields.c");

	using (var archive = new Archive())
	{
		// アーカイブにファイルを追加する
		archive.CreateEntry("alice29.txt", fi1);
		archive.CreateEntry("fields.c", fi2);
		// ZIPアーカイブを作成する
		archive.Save(zipFile, new ArchiveSaveOptions() { Encoding = Encoding.ASCII });
	}
}

パスを使用したZIPファイル

ZIPエントリにFileInfoまたはFileStreamクラスを使用する代わりに、ファイルのパスをArchive.CreateEntry(String name, String path、Boolean openImmediately、ArchiveEntrySettings newEntrySettings)メソッドに直接指定できます。次のコードサンプルは、パスを使用してファイルをZIPする方法を示しています。

// 出力ZIPアーカイブ用のFileStreamを作成します
using (FileStream zipFile = File.Open("archive.zip", FileMode.Create))
{
    // アーカイブを作成する
    using (var archive = new Archive())
    {
        // ZIPアーカイブにファイルを追加
        archive.CreateEntry("data.bin", "file.dat");
        archive.Save(zipFile);
    }
}

C#でZIPアーカイブにフォルダーを追加する

フォルダをZIPすることもできます。これは、ZIPアーカイブに複数のファイルを追加する別の方法です。ソースファイルをフォルダに入れ、そのフォルダをZIPアーカイブに追加するだけです。フォルダをZIPする手順は次のとおりです。

次のコードサンプルは、C#でZIPにフォルダーを追加する方法を示しています。

// 出力ZIPアーカイブ用のFileStreamを作成します
using (FileStream zipFile = File.Open("compress_directory.zip", FileMode.Create))
{
	using (Archive archive = new Archive())
	{
		// 圧縮するフォルダ
		DirectoryInfo corpus = new DirectoryInfo("CanterburyCorpus");
		archive.CreateEntries(corpus);
		// ZIPアーカイブを作成する
		archive.Save(zipFile);
	}
}

C#でZipCryptoを使用してパスワードで保護されたZIPを作成する

パスワードを使用してZIPアーカイブを保護し、ZipCrypto暗号化を適用できます。このため、ArchiveEntrySettingsクラスは、2番目のパラメーターとして暗号化タイプを受け入れるArchiveのコンストラクターで使用されます。

次のコードサンプルは、C#でZipCryptoを使用してパスワードで保護されたZIPアーカイブを作成する方法を示しています。

// 出力ZIPアーカイブ用のFileStreamを作成します
using (FileStream zipFile = File.Open("compress_directory.zip", FileMode.Create))
{
	using (Archive archive = new Archive(new ArchiveEntrySettings(null, new TraditionalEncryptionSettings("p@s$"))))
	{
		// アーカイブにフォルダを追加します
		DirectoryInfo corpus = new DirectoryInfo("CanterburyCorpus");
		archive.CreateEntries(corpus);
		// ZIPアーカイブを作成する
		archive.Save(zipFile);
	}
}

C#AES暗号化を使用してパスワードで保護されたZIPを作成する

Aspose.ZIP for .NETでは、AES暗号化を適用してZIPアーカイブを保護することもできます。次のAES暗号化方式を使用できます。

  • AES128
  • AES192
  • AES256

AES暗号化を適用するために、APIはAesEcryptionSettingsクラスを提供します。次のコードサンプルは、C#でAES暗号化を使用してパスワードで保護されたZIPを作成する方法を示しています。

// 出力ZIPアーカイブ用のFileStreamを作成します
using (FileStream zipFile = File.Open("compress_directory.zip", FileMode.Create))
{
	using (Archive archive = new Archive(new ArchiveEntrySettings(null, new AesEcryptionSettings("p@s$", EncryptionMethod.AES128))))
	{
		// アーカイブするフォルダを追加する
		DirectoryInfo corpus = new DirectoryInfo("CanterburyCorpus");
		archive.CreateEntries(corpus);
		// ZIPアーカイブを作成する
		archive.Save(zipFile);
	}
}

並列圧縮モードを設定する

複数のエントリがある場合は、並列圧縮用にAPIを構成することもできます。このため、ParallelOptionsクラスを使用して並列圧縮モードを指定できます。 Aspose.ZIP for .NETは、次の並列圧縮モードを提供します。

  • しない-並行して圧縮しないでください。
  • 常に-並行して圧縮してください(メモリ不足に注意してください)。
  • 自動-エントリに対して並列圧縮を使用するかどうかを決定します。このオプションは、一部のエントリを並列にのみ圧縮する場合があります。

次のコードサンプルは、複数のファイルを圧縮しながら並列圧縮モードを設定する方法を示しています。

// 完全な例とデータファイルについては、https://github.com/aspose-zip/Aspose.ZIP-for-.NETにアクセスしてください。
using (FileStream zipFile = File.Open(dataDir + "UsingParallelismToCompressFiles_out.zip", FileMode.Create))
{
    using (FileStream source1 = File.Open(dataDir + "alice29.txt", FileMode.Open, FileAccess.Read))
    {
        using (FileStream source2 = File.Open(dataDir + "asyoulik.txt", FileMode.Open, FileAccess.Read))
        {
            using (var archive = new Archive())
            {
                archive.CreateEntry("alice29.txt", source1);
                archive.CreateEntry("asyoulik.txt", source2);
                //並列処理基準を定義する
                var parallelOptions = new ParallelOptions
                {
                    ParallelCompressInMemory = ParallelCompressionMode.Always
                };
                archive.Save(zipFile,
                    new ArchiveSaveOptions()
                    {
                        ParallelOptions = parallelOptions,
                        Encoding = Encoding.ASCII,
                        ArchiveComment = "There are two poems from Canterbury corpus"
                    });
            }
        }
    }
}

Aspose.ZIPfor.NETの詳細

次のリソースを使用して、C#ZIPAPIの詳細を確認してください。

結論

この記事では、C#でプログラムによってZIPアーカイブを作成する方法を学びました。コードサンプルは、ZIPアーカイブにファイルとフォルダーを追加する方法を示しています。さらに、C#でZipCryptoおよびAES暗号化方式を使用してパスワードで保護されたZIPアーカイブを作成する方法についても説明しました。それに加えて、複数のエントリの並列圧縮についても最後に説明します。ご不明な点やご質問がございましたら、フォーラムからお問い合わせください。

も参照してください