C#, .NET で ZIP アーカイブの圧縮・展開

C#

概要

System.IO.Compression namespace の ZipFile ZipArchive ZipArchiveEntry クラスを使って、ZIP アーカイブの圧縮・展開などを行います。

作成したプログラムはこちらで公開しています。
https://github.com/matsushima-terunao/test_cs/tree/main/ArchiveTest/ArchiveTest

using ディレクティブ

using System.IO.Compression;

アーカイブ内のエントリー一覧

ZipFile.Open または OpenRead メソッドで ZIP アーカイブを開きます。アーカイブ内のエントリー一覧は ZipArchive.Entries プロパティ内に入っています。

// 読み取り専用でアーカイブを開く
openArchivePath = path;
using (ZipArchive archive = ZipFile.OpenRead(openArchivePath)){
	// ListViewItem 追加
	foreach (var entry in archive.Entries)
	{
		var item = new ListViewItem(entry.Name);
		item.SubItems.Add(Path.GetDirectoryName(entry.FullName));
		item.SubItems.Add(entry.LastWriteTime.ToString("yyyy/MM/dd HH:mm:ss"));
		item.SubItems.Add(entry.Length.ToString());
		item.Tag = entry;
		listView1.Items.Add(item);
	}
}

全て展開

ZipFile.ExtractToDirectory または ZipArchive.ExtractToDirectory メソッドで全ファイルを展開します。
同名のファイルがあった場合、overwriteFiles パラメーターが true の場合は上書き、false の場合は例外が発生します。

// 展開先のフォルダ選択
if (DialogResult.OK == folderBrowserDialog.ShowDialog())
{
	ZipFile.ExtractToDirectory(openArchivePath, folderBrowserDialog.SelectedPath, true);
}

指定ファイルを展開

ZipArchiveEntry.ExtractToFile メソッドで該当ファイルを展開します。
同名のファイルがあった場合、overwrite パラメーターが true の場合は上書き、false の場合は例外が発生します。

// 展開先のフォルダ選択
if (DialogResult.OK == folderBrowserDialog.ShowDialog())
{
	// 読み取り専用でアーカイブを開く
	using (ZipArchive archive = ZipFile.OpenRead(openArchivePath))
	{
		foreach (ListViewItem item in listView1.SelectedItems)
		{
			// 選択ファイルと一致するエントリーを展開
			var entry = (ZipArchiveEntry)item.Tag;
			string path = Path.Combine(folderBrowserDialog.SelectedPath, entry.Name);
			var extractEntry = archive.GetEntry(entry.Name);
			extractEntry?.ExtractToFile(path, true);
		}
	}
}

フォルダー内のファイルを圧縮

ZipFile.CreateFromDirectory メソッドでフォルダー内のファイルを圧縮して ZIP アーカイブを作成します。

// ファイル保存ダイアログ
SaveFileDialog saveFileDialog = new() { Filter = "ZIP ファイル (*.zip)|*.zip|すべてのファイル (*.*)|*.*" };
saveFileDialog.FileName = Path.GetFileName(openFolderPath) + ".zip";
if (DialogResult.OK == saveFileDialog.ShowDialog())
{
	// ファイルが既に存在していたら削除
	if (File.Exists(saveFileDialog.FileName))
	{
		File.Delete(saveFileDialog.FileName);
	}
	// アーカイブに圧縮
	ZipFile.CreateFromDirectory(openFolderPath, saveFileDialog.FileName);
}

ファイルを追加

ZipArchive.CreateEntryFromFile メソッドでアーカイブにファイルを追加します。

// 読み書き用にアーカイブを開く
using (ZipArchive archive = ZipFile.Open(openArchivePath, ZipArchiveMode.Update))
{
	foreach (string path in paths)
	{
		string dir = Path.GetDirectoryName(path) ?? "";
		foreach (var file in new DirectoryInfo(path).EnumerateFiles("*", SearchOption.AllDirectories))
		{
			// 選択フォルダーを起点とした相対パスでエントリーを作成
			archive.CreateEntryFromFile(file.FullName, Path.GetRelativePath(dir, file.FullName));
		}
	}
}

ファイルを削除

ZipArchiveEntry.Delete メソッドで該当ファイルを削除します。

// 読み書き用にアーカイブを開く
using (ZipArchive archive = ZipFile.Open(openArchivePath, ZipArchiveMode.Update))
{
	foreach (ListViewItem item in listView1.SelectedItems)
	{
		// 選択ファイルと一致するエントリーを削除
		var entry = (ZipArchiveEntry)item.Tag;
		var deleteEntry = archive.GetEntry(entry.Name);
		deleteEntry?.Delete();
	}
}

コメント

タイトルとURLをコピーしました