【C#】7zipファイルの展開・圧縮方法

【C#】7zipファイルの展開・圧縮方法

Squid-Box.SevenZipSharpによる7zipファイルの展開・圧縮方法について記載します。

<確認環境>
Windows10 64bit
Visual Studio 2022
.NET6.0
Squid-Box.SevenZipSharp v1.6.1.23
7zip v19.00(x64)

Squid-Box.SevenZipSharpとは

Squid-Box.SevenZipSharpは、7zipファイルを簡単に操作するためのオープンソースのライブラリで、.NET Frameworkおよび.NETCoreで使用できます。ライセンスはLGPL-3.0で提供されます。

インストール

Squid-Box.SevenZipSharpのインストール

Visual Studio のメニューから[ツール] > [NuGet パッケージマネージャー] > [パッケージマネージャーコンソール] を選択して以下のコマンドを実行します。

Install-Package Squid-Box.SevenZipSharp

または、[プロジェクト] > [NuGet パッケージ管理]でSquid-Box.SevenZipSharpを検索してインストールします。
Squid-Box.SevenZipSharpのインストール

7zipのインストール

以下のサイトから7zipインストーラーをダウンロードしてインストールします。
https://7-zip.org/download.html

Squid-Box.SevenZipSharpによる7zipファイル展開

7zipファイルの展開例を記載します。

ディレクトリに展開

7zipファイルを指定したディレクトリに展開します。

SetLibraryPathメソッド : 7z.dllのパスを指定します。
SevenZipExtractorクラス : 7zipファイル展開クラス。第1引数に展開する7zipファイル、第2引数にパスワードを指定します。(パスワードがないときは指定しない。)
ExtractArchiveメソッド : 指定したディレクトリに7zipファイルを展開します。

using SevenZip;

// 7z.dllファイルパス設定
SevenZip.SevenZipBase.SetLibraryPath(@"C:\Program Files\7-Zip\7z.dll");

using (var extractor = new SevenZipExtractor(@"C:\work\archive.7z", @"password"))
{
    // ディレクトリに7zipファイルを展開
    extractor.ExtractArchive(@"C:\work\archive");
}

メモリに展開

7zipファイルの内容をメモリ上に展開して取得します。

SetLibraryPathメソッド : 7z.dllのパスを指定します。
SevenZipExtractorクラス : 7zipファイル展開クラス。第1引数に展開する7zipファイル、第2引数にパスワードを指定します。(パスワードがないときは指定しない。)
ExtractFileメソッド : 第1引数に展開するファイル、第2引数にStreamを指定します。

using SevenZip;

// 7z.dllファイルパス設定
SevenZip.SevenZipBase.SetLibraryPath(@"C:\Program Files\7-Zip\7z.dll");

using (var extractor = new SevenZipExtractor(@"C:\work\archive.7z", "password"))
{
    // ファイルパス取得
    var fileName = extractor.ArchiveFileNames.First(x => x.Contains("file01.txt"));
    // MemoryStreamにファイル展開
    var memoryStream = new MemoryStream();
    extractor.ExtractFile(fileName, memoryStream);
    // MemoryStreamから文字列を読み込む
    var text = System.Text.Encoding.UTF8.GetString(memoryStream.ToArray());
}

Squid-Box.SevenZipSharpによる7zipファイル圧縮

7zipファイルの圧縮例を記載します。

ディレクトリを圧縮

指定したディレクトリ以下のすべてのファイルを7zipファイルに圧縮します。

SetLibraryPathメソッド : 7z.dllのパスを指定します。
SevenZipCompressorクラス : 7zipファイル圧縮クラス。プロパティに圧縮モード、圧縮レベル、圧縮方式を設定できます。
CompressDirectoryメソッド : 第1引数に圧縮するディレクトリ、第2引数に圧縮後のファイルパス、第3引数にパスワードを指定します。(パスワードがないときは指定しない。)

using SevenZip;

// 7z.dllファイルパス設定
SevenZip.SevenZipBase.SetLibraryPath(@"C:\Program Files\7-Zip\7z.dll");

var compressor = new SevenZipCompressor();
compressor.CompressionMode = CompressionMode.Create;     // 圧縮モード設定
compressor.CompressionLevel = CompressionLevel.Ultra;    // 圧縮レベル設定
compressor.CompressionMethod = CompressionMethod.Lzma2;  // 圧縮方式設定

// ディレクトリ以下を7zipファイルに圧縮
compressor.CompressDirectory(@"C:\work\archive", @"C:\work\archive.7z", @"password");

メモリの内容を圧縮

メモリに保持している内容を圧縮して7zipファイルを作成します。

SetLibraryPathメソッド : 7z.dllのパスを指定します。
SevenZipCompressorクラス : 7zipファイル圧縮クラス。プロパティに圧縮モード、圧縮レベル、圧縮方式を設定できます。
CompressStreamDictionaryメソッド : 第1引数に圧縮データ(ファイル名とStream)、第2引数に圧縮データを格納するStream、第3引数にパスワードを指定します。(パスワードがないときは指定しない。)

using SevenZip;

// 7z.dllファイルパス設定
SevenZip.SevenZipBase.SetLibraryPath(@"C:\Program Files\7-Zip\7z.dll");

// 圧縮するStream作成
var stream1 = new MemoryStream();
var writer1 = new StreamWriter(stream1);
writer1.Write(@"おはよう");
writer1.Flush();
stream1.Position = 0;

var stream2 = new MemoryStream();
var writer2 = new StreamWriter(stream2);
writer2.Write(@"こんにちは");
writer2.Flush();
stream2.Position = 0;

// 圧縮するStreamをDictionaryに登録する
var streamDict = new Dictionary<string, Stream>
{
    { @"file01.txt", stream1 },
    { @"file02.txt", stream2 }
};

// 圧縮後のデータを格納するMemoryStream作成
using (var compressedStream = new MemoryStream())
{
    // 7zipファイルに圧縮
    var compressor = new SevenZipCompressor();
    compressor.CompressionMode = CompressionMode.Create;     // 圧縮モード設定
    compressor.CompressionLevel = CompressionLevel.Ultra;    // 圧縮レベル設定
    compressor.CompressionMethod = CompressionMethod.Lzma2;  // 圧縮方式設定
    compressor.CompressStreamDictionary(streamDict, compressedStream, @"password");

    // 圧縮データをファイルに書き出す
    using (var fileStream = new FileStream(@"C:\work\archive.7z", FileMode.Create, FileAccess.Write))
    {
        compressedStream.Seek(0, SeekOrigin.Begin);
        compressedStream.CopyTo(fileStream);
    }
}


Next Post Previous Post