アーカイブ

[C#] パスワード付き7zipを圧縮・解凍する方法を解説

C#でパスワード付き7zファイルを圧縮・解凍するには、外部ライブラリを使用するのが一般的です。

代表的なライブラリとして 7-ZipSharpCompress があります。

7-Zipの公式DLL 7z.dll を使う場合、P/Invokeを利用してC#から直接操作できますが、手間がかかるため、7-Zipコマンドラインツールを呼び出す方法が簡単です。

System.Diagnostics.Processを使って、7z.exeを実行し、圧縮や解凍時にパスワードオプション-pを指定します。

7zファイルの圧縮・解凍に必要な準備

7-Zipのインストール

7-Zipは、オープンソースのファイル圧縮・解凍ソフトウェアです。

以下の手順でインストールできます。

  1. 公式サイト(https://www.7-zip.org/)にアクセスします。
  2. お使いのOSに合ったインストーラーをダウンロードします。
  3. ダウンロードしたファイルを実行し、インストールを完了させます。

インストール後、7-Zipが正常に動作することを確認してください。

7z.exeのパスを確認する

7-Zipをインストールすると、7z.exeという実行ファイルが生成されます。

このファイルのパスを確認することが重要です。

通常、以下のパスにインストールされます。

  • 32ビット版: C:\Program Files\7-Zip\7z.exe
  • 64ビット版: C:\Program Files (x86)\7-Zip\7z.exe

パスが異なる場合は、インストール先を確認してください。

後でC#からこのパスを使用して、7z.exeを呼び出します。

C#プロジェクトでの外部プロセス実行の準備

C#で外部プロセスを実行するためには、System.Diagnostics名前空間を使用します。

以下の手順で準備を行います。

  1. C#プロジェクトを作成します。
  2. System.Diagnostics名前空間をインポートします。

サンプルコードは以下の通りです。

using System.Diagnostics;
class Program
{
    static void Main(string[] args)
    {
        // ここに外部プロセスを実行するコードを追加します
    }
}

この準備が整ったら、次のステップで7z.exeを呼び出すことができます。

C#で7zファイルを圧縮する方法

System.Diagnostics.Processを使った7z.exeの呼び出し

C#から7z.exeを呼び出すには、System.Diagnostics.Processクラスを使用します。

このクラスを使うことで、外部プログラムを実行し、その出力を取得することができます。

以下は、7z.exeを呼び出す基本的なサンプルコードです。

using System.Diagnostics;
class Program
{
    static void Main(string[] args)
    {
        // 7z.exeのパスを指定します
        string sevenZipPath = @"C:\Program Files\7-Zip\7z.exe";
        
        // 圧縮するファイルと出力ファイルのパスを指定します
        string inputFile = @"C:\path\to\input\file.txt";
        string outputFile = @"C:\path\to\output\archive.7z";
        // ProcessStartInfoを設定します
        ProcessStartInfo processInfo = new ProcessStartInfo
        {
            FileName = sevenZipPath,
            Arguments = $"a \"{outputFile}\" \"{inputFile}\"", // 圧縮コマンド
            RedirectStandardOutput = true,
            RedirectStandardError = true,
            UseShellExecute = false,
            CreateNoWindow = true
        };
        // プロセスを開始します
        using (Process process = Process.Start(processInfo))
        {
            // 出力を取得します
            string output = process.StandardOutput.ReadToEnd();
            string error = process.StandardError.ReadToEnd();
            process.WaitForExit();
            // 結果を表示します
            System.Console.WriteLine(output);
            System.Console.WriteLine(error);
        }
    }
}

圧縮コマンドの基本構文

7z.exeを使用してファイルを圧縮する基本的なコマンド構文は以下の通りです。

7z a [出力ファイル名] [圧縮するファイル名]
  • a: アーカイブを作成するコマンド
  • [出力ファイル名]: 作成する圧縮ファイルの名前
  • [圧縮するファイル名]: 圧縮対象のファイル名

パスワード付き圧縮のコマンドオプション

パスワードを設定して圧縮する場合、コマンドに-pオプションを追加します。

以下のように指定します。

7z a -p[パスワード] [出力ファイル名] [圧縮するファイル名]
Arguments = $"a -pMySecretPassword \"{outputFile}\" \"{inputFile}\""

圧縮処理のエラーハンドリング

圧縮処理中にエラーが発生した場合、StandardErrorからエラーメッセージを取得できます。

上記のサンプルコードでは、エラーメッセージを表示する部分が含まれています。

エラーが発生した場合は、以下のようにエラーメッセージを確認できます。

if (!string.IsNullOrEmpty(error))
{
    System.Console.WriteLine("エラーが発生しました: " + error);
}

圧縮後のファイル確認方法

圧縮処理が成功したかどうかを確認するためには、出力ファイルが存在するかをチェックします。

以下のように実装できます。

if (System.IO.File.Exists(outputFile))
{
    System.Console.WriteLine("圧縮が成功しました: " + outputFile);
}
else
{
    System.Console.WriteLine("圧縮に失敗しました。");
}

このようにして、圧縮処理の結果を確認することができます。

C#で7zファイルを解凍する方法

解凍コマンドの基本構文

7z.exeを使用してファイルを解凍する基本的なコマンド構文は以下の通りです。

7z x [圧縮ファイル名]
  • x: アーカイブを解凍するコマンド
  • [圧縮ファイル名]: 解凍する7zファイルの名前

以下は、C#で解凍処理を行うサンプルコードです。

using System.Diagnostics;
class Program
{
    static void Main(string[] args)
    {
        // 7z.exeのパスを指定します
        string sevenZipPath = @"C:\Program Files\7-Zip\7z.exe";
        
        // 解凍する7zファイルと出力先のパスを指定します
        string archiveFile = @"C:\path\to\input\archive.7z";
        string outputDirectory = @"C:\path\to\output\";
        // ProcessStartInfoを設定します
        ProcessStartInfo processInfo = new ProcessStartInfo
        {
            FileName = sevenZipPath,
            Arguments = $"x \"{archiveFile}\" -o\"{outputDirectory}\"", // 解凍コマンド
            RedirectStandardOutput = true,
            RedirectStandardError = true,
            UseShellExecute = false,
            CreateNoWindow = true
        };
        // プロセスを開始します
        using (Process process = Process.Start(processInfo))
        {
            // 出力を取得します
            string output = process.StandardOutput.ReadToEnd();
            string error = process.StandardError.ReadToEnd();
            process.WaitForExit();
            // 結果を表示します
            System.Console.WriteLine(output);
            System.Console.WriteLine(error);
        }
    }
}

パスワード付き解凍のコマンドオプション

パスワードが設定された7zファイルを解凍する場合、コマンドに-pオプションを追加します。

以下のように指定します。

7z x -p[パスワード] [圧縮ファイル名]
Arguments = $"x -pMySecretPassword \"{archiveFile}\" -o\"{outputDirectory}\""

解凍処理のエラーハンドリング

解凍処理中にエラーが発生した場合、StandardErrorからエラーメッセージを取得できます。

上記のサンプルコードでは、エラーメッセージを表示する部分が含まれています。

エラーが発生した場合は、以下のようにエラーメッセージを確認できます。

if (!string.IsNullOrEmpty(error))
{
    System.Console.WriteLine("エラーが発生しました: " + error);
}

解凍後のファイル確認方法

解凍処理が成功したかどうかを確認するためには、出力先ディレクトリに解凍されたファイルが存在するかをチェックします。

以下のように実装できます。

string[] extractedFiles = System.IO.Directory.GetFiles(outputDirectory);
if (extractedFiles.Length > 0)
{
    System.Console.WriteLine("解凍が成功しました。解凍されたファイル:");
    foreach (var file in extractedFiles)
    {
        System.Console.WriteLine(file);
    }
}
else
{
    System.Console.WriteLine("解凍に失敗しました。");
}

このようにして、解凍処理の結果を確認することができます。

SharpCompressを使った7zファイルの操作

SharpCompressのインストール方法

SharpCompressは、.NET環境で圧縮・解凍処理を行うためのライブラリです。

NuGetパッケージマネージャーを使用して簡単にインストールできます。

  1. Visual Studioを開き、対象のプロジェクトを選択します。
  2. メニューから「ツール」→「NuGetパッケージマネージャー」→「パッケージマネージャーコンソール」を選択します。
  3. 以下のコマンドを入力してSharpCompressをインストールします。
Install-Package SharpCompress

インストールが完了したら、プロジェクトでSharpCompressを使用できるようになります。

SharpCompressでの圧縮処理

SharpCompressを使用してファイルを圧縮する方法は以下の通りです。

以下のサンプルコードでは、指定したファイルを7z形式で圧縮します。

using System.IO;
using SharpCompress.Archive;
using SharpCompress.Common;
using SharpCompress.Writers;
class Program
{
    static void Main(string[] args)
    {
        // 圧縮するファイルと出力ファイルのパスを指定します
        string inputFile = @"C:\path\to\input\file.txt";
        string outputFile = @"C:\path\to\output\archive.7z";
        // 7zアーカイブを作成します
        using (var archive = ArchiveFactory.Create(ArchiveType.SevenZip))
        {
            archive.AddEntry(Path.GetFileName(inputFile), inputFile);
            using (var stream = File.OpenWrite(outputFile))
            {
                archive.SaveTo(stream, CompressionType.Deflate);
            }
        }
        System.Console.WriteLine("圧縮が完了しました: " + outputFile);
    }
}

SharpCompressでの解凍処理

SharpCompressを使用して7zファイルを解凍する方法は以下の通りです。

以下のサンプルコードでは、指定した7zファイルを解凍します。

using System.IO;
using SharpCompress.Archive;
using SharpCompress.Common;
class Program
{
    static void Main(string[] args)
    {
        // 解凍する7zファイルと出力先のパスを指定します
        string archiveFile = @"C:\path\to\input\archive.7z";
        string outputDirectory = @"C:\path\to\output\";
        // 7zアーカイブを解凍します
        using (var archive = ArchiveFactory.Open(archiveFile))
        {
            foreach (var entry in archive.Entries)
            {
                if (!entry.IsDirectory)
                {
                    entry.Extract(outputDirectory);
                }
            }
        }
        System.Console.WriteLine("解凍が完了しました。");
    }
}

SharpCompressの制限事項と注意点

SharpCompressを使用する際の制限事項や注意点は以下の通りです。

制限事項・注意点説明
パスワード保護のサポートパスワード付きアーカイブの解凍はサポートされていますが、圧縮時のパスワード設定は未サポートです。
大きなファイルの処理非常に大きなファイルを扱う場合、メモリ使用量に注意が必要です。
一部の圧縮形式の制限すべての圧縮形式に対応しているわけではありません。特に古い形式には注意が必要です。

これらの点に留意しながら、SharpCompressを活用して7zファイルの圧縮・解凍処理を行ってください。

圧縮・解凍処理の応用例

複数ファイルを一括で圧縮する方法

複数のファイルを一括で圧縮するには、AddEntryメソッドをループで呼び出すことで実現できます。

以下のサンプルコードでは、指定したディレクトリ内のすべてのファイルを7z形式で圧縮します。

using System.IO;
using SharpCompress.Archive;
using SharpCompress.Common;
class Program
{
    static void Main(string[] args)
    {
        // 圧縮するディレクトリと出力ファイルのパスを指定します
        string inputDirectory = @"C:\path\to\input\";
        string outputFile = @"C:\path\to\output\archive.7z";
        // 7zアーカイブを作成します
        using (var archive = ArchiveFactory.Create(ArchiveType.SevenZip))
        {
            foreach (var file in Directory.GetFiles(inputDirectory))
            {
                archive.AddEntry(Path.GetFileName(file), file);
            }
            using (var stream = File.OpenWrite(outputFile))
            {
                archive.SaveTo(stream, CompressionType.Deflate);
            }
        }
        System.Console.WriteLine("複数ファイルの圧縮が完了しました: " + outputFile);
    }
}

圧縮ファイルの進捗状況を表示する方法

圧縮処理の進捗状況を表示するには、圧縮するファイルの数をカウントし、各ファイルの圧縮が完了するたびに進捗を表示します。

以下のサンプルコードでは、進捗状況をコンソールに表示します。

using System.IO;
using SharpCompress.Archive;
using SharpCompress.Common;
class Program
{
    static void Main(string[] args)
    {
        string inputDirectory = @"C:\path\to\input\";
        string outputFile = @"C:\path\to\output\archive.7z";
        var files = Directory.GetFiles(inputDirectory);
        int totalFiles = files.Length;
        using (var archive = ArchiveFactory.Create(ArchiveType.SevenZip))
        {
            for (int i = 0; i < totalFiles; i++)
            {
                archive.AddEntry(Path.GetFileName(files[i]), files[i]);
                System.Console.WriteLine($"圧縮中: {i + 1}/{totalFiles} ファイル");
            }
            using (var stream = File.OpenWrite(outputFile))
            {
                archive.SaveTo(stream, CompressionType.Deflate);
            }
        }
        System.Console.WriteLine("圧縮が完了しました: " + outputFile);
    }
}

圧縮・解凍処理を非同期で実行する方法

非同期処理を行うには、asyncawaitを使用します。

以下のサンプルコードでは、圧縮処理を非同期で実行します。

using System.IO;
using System.Threading.Tasks;
using SharpCompress.Archive;
using SharpCompress.Common;
class Program
{
    static async Task Main(string[] args)
    {
        string inputFile = @"C:\path\to\input\file.txt";
        string outputFile = @"C:\path\to\output\archive.7z";
        await Task.Run(() =>
        {
            using (var archive = ArchiveFactory.Create(ArchiveType.SevenZip))
            {
                archive.AddEntry(Path.GetFileName(inputFile), inputFile);
                using (var stream = File.OpenWrite(outputFile))
                {
                    archive.SaveTo(stream, CompressionType.Deflate);
                }
            }
        });
        System.Console.WriteLine("非同期圧縮が完了しました: " + outputFile);
    }
}

圧縮ファイルの内容をプログラムで確認する方法

圧縮ファイルの内容を確認するには、Entriesプロパティを使用してアーカイブ内のエントリを列挙します。

以下のサンプルコードでは、指定した7zファイルの内容を表示します。

using SharpCompress.Archive;
class Program
{
    static void Main(string[] args)
    {
        string archiveFile = @"C:\path\to\input\archive.7z";
        using (var archive = ArchiveFactory.Open(archiveFile))
        {
            System.Console.WriteLine("アーカイブ内のファイル:");
            foreach (var entry in archive.Entries)
            {
                if (!entry.IsDirectory)
                {
                    System.Console.WriteLine(entry.Key);
                }
            }
        }
    }
}

このようにして、圧縮・解凍処理の応用例を活用し、さまざまなシナリオに対応することができます。

まとめ

この記事では、C#を使用して7zファイルを圧縮・解凍する方法や、SharpCompressライブラリを活用した操作方法について詳しく解説しました。

また、圧縮・解凍処理の応用例として、複数ファイルの一括圧縮や進捗状況の表示、非同期処理の実装方法についても触れました。

これらの知識を活用して、実際のプロジェクトで効率的にファイル管理を行うことをお勧めします。

関連記事

Back to top button