概要
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();
}
}
コメント