C#のWinFormsでZipファイルのコメントを編集する。

コンピュータ

.NETのZipArchiveがいつの間にかコメントのプロパティが出現していたので(昔からあった?)Zipファイルのコメントを編集するフォームを作成してみました。

ソースコード

ファイル名:Program.cs

using System.IO.Compression;

namespace EditCommentZipFile;

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        // コマンドライン引数
        string[] args = System.Environment.GetCommandLineArgs();
        if (2 > args.Length)
        {
            this.Close();
            return;
        }

        // zipファイルのパス
        string filePath = args[1];
        if (!Path.GetExtension(filePath).Equals(".ZIP", StringComparison.CurrentCultureIgnoreCase))
        {
            this.Close();
            return;
        }

        // コメントの読み込み
        string comment = "";
        using(var fs = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite))
        using(var zip = new ZipArchive(fs, ZipArchiveMode.Update))
        {
            comment = zip.Comment;
        }

        Size = new Size(640, 360);
        Text = "ZIPファイルのコメント編集";

        var panel = new TableLayoutPanel
        {
            Dock = DockStyle.Fill,
            Padding = new Padding(16),
        };

        string msg = Path.GetFileName(filePath) + "のコメント";
        var label = new Label
        {
            Dock = DockStyle.Fill,
            Margin = new Padding(16),
            Text = msg,
        };
        panel.Controls.Add(label, 0, 0);

        var tbox = new TextBox
        {
            Dock = DockStyle.Fill,
            Margin = new Padding(16),
            Text = comment,
        };
        panel.Controls.Add(tbox, 0, 1);

        var panel2 = new FlowLayoutPanel
        {
            Margin = new Padding(16),
            Anchor = AnchorStyles.None,
            Dock = DockStyle.Fill,
        };
        panel.Controls.Add(panel2, 0, 2);

        var okBtn = new Button
        {
            Margin = new Padding(16),
            Size = new Size(100, 40),
            Text = "OK",
        };
        panel2.Controls.Add(okBtn);

        var cancelBtn = new Button
        {
            Margin = new Padding(16),
            Size = new Size(100, 40),
            Text = "Cancel",
        };
        panel2.Controls.Add(cancelBtn);

        Controls.Add(panel);
        Action<Form> okAction = (Form form) =>
        {
            string str = tbox.Text;
            using(var fs = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite))
            using(var zip = new ZipArchive(fs, ZipArchiveMode.Update))
            {
                zip.Comment = str;
            }
            form.Close();
        };
        Action<Form> cancelAction = (Form form) =>
        {
            form.Close();
        };
        okBtn.Click += (s, e) => okAction(this);
        tbox.KeyDown += (s, e) =>
        {
            if (e.KeyCode == Keys.Return)
            {
                okAction(this);
            }
        };
        cancelBtn.Click += (s, e) => cancelAction(this);
    }
}

使い方

zipファイルを引数に実行するとコメント編集用のフォームが起動します。

「Win」+「R」⇒「shell:sendto」にビルドしたexeファイルのショートカットをセットしてエクスプローラーのコンテキストメニュー「送る」から起動することを想定しています。

感想

zipファイルにコメント(文字列)を埋め込むことが出来ることが確認できました。zip.exeのzオプションで確認すると漢字が文字化けしていますので、多分文字コードがUTF8でセットしていると思われます。zipの仕様的に文字コードが何が正解なのかは知りませんが、周りの環境がUTF8になっていますので、この方法が都合がよいです。

あとはコメントの一覧表示や検索機能が欲しいところです。デスクトップアプリケーションであればエクスプローラーのようなファイルマネージャに組み込みたいところです。CLIであればファイルの一覧コマンドにコメントを表示する機能を組み合わせ、コメントを絞り込み検索するような使い方が良さそうです。ファイルサーバーにWebのUIを持たせて全文検索が出来れば個人的には最高なのですが、実用的な検索速度を確保しようとするとインデックスを蓄えるDBが必要になります。そうなると結構本格的なシステムを考える必要になってきます。基本行き当たりばったりで、その時必要なものを小さなプログラムを作成すようにしているので、維持管理に労力必要なシステムは自分には合わない感じがします。

コメント