解析エンジニアの自動化 blog

コツコツと自動化した方法を残す blog

C# でドラッグ&ドロップしたファイルのパスワード付き zip ファイルを作る



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。



この記事の目次



目的


前の記事で、ファイルをドロップしたら zip ファイルが作成される VBScript を作成したのですが、パスワードをかけられませんでした。

私が特殊なのかもしれませんが、 zip ファイルってメールに添付する時にしか使って無いんですよね。

だから、ここまでする必要あるのかっていう意見もあるかもしれませんが、 C# でファイルをドロップしたらパスワード付きの zip ファイルが作成されるプログラムを作ります。



下準備

開発環境

Visual Studio 2017 Community

プログラム言語

C#

DLL

DotNetZip

プログラムが出来上がるまで

.NET Framework 4.5 以降から ZipFile クラスという zip ファイルを扱うクラスが追加されています。

それで、よく調べもせず、とりあえずパスワード無しの zip ファイル作成プログラム作ったのですが、いざ、パスワードを付けようと調べたら ZipFile クラスからはパスワードを設定できる様な仕様は見つかりませんでした。

パスワードが設定出来る zip ファイルの事を調べていたら、 DotNetZip という DLL がある事が分かりました。

結局、 C#DotNetZip を使ってプログラムを作成しました。

DotNetZip のダウンロードと使い方

まずは検索します。図1 の通りに検索しました。
図 1 検索するところ


検索結果は図2 の通りです。1番上のWebページを開きます。
図 2 検索したところ


図3 の画面が表示されたら、『Tools』をクリックします。
図 3 検索結果のトップを開いたところ


『Tools』の中の『Ionic.Zip.dll』をクリックします。
図 4 Tools を開いたところ


図5 の画面右下の『Download』をクリックしてダウンロードします。
図 5 ダウンロード画面


ダウンロードした『Ionic.Zip.dll』のアイコン画像です。
図 6 dll アイコン


visual studio で参照設定を行った画面です。
図 7 Visual Studio 2017 Community の参照設定


ILMerge のダウンロードと使い方

図8 の『Download』ボタンをクリックします。
図 8 ILMerge のダウンロードページ


図8 の『Download』ボタンをクリックすると、図9 のページに遷移します。
図 9 ILMerge のダウンロード


ダウンロードした ILMerge のアイコン画像です。
図 10 ILMerge のアイコン


コマンドプロンプトを起動した画面です。
図 11 コマンドプロンプト


exe ファイルと dll ファイルを 1 つにまとめた exe ファイルの出力フォルダに移動します。
図 12 出力フォルダへ移動

図 13 出力フォルダへ移動


ILMerge.exe を指定します。
図 14 ILMerge.exe の指定


結合する exe ファイルを指定します。
図 15 結合する exe の指定


結合する dll ファイルを指定します。
図 16 結合する dll の指定


結合した後の exe ファイルの名前を指定します。
図 17 exe ファイルの名前


プラットフォームを指定します。
図 18 プラットフォームの指定



関数

ソースコード


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using Ionic.Zip;
using Ionic.Zlib;
 
 
namespace DotNetZip
{
    class Program
    {
        static void Main(string[] args)
        {
            // 自分のパスを取得する
            string selfPath = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
 
            // 日付をパスに使用できるように / を - に置換する
            // 時間をパスで使用できるように : を - に置換する
            DateTime dtDateTime = DateTime.Now;                // 現在の日時を取得
            string strDateTime = dtDateTime.ToString();        // 文字列に変換する
            string[] arrDateTime = strDateTime.Split(' ');     //スペースで分割し、配列に格納する
            arrDateTime[0] = arrDateTime[0].Replace("/", "-"); // 日付置換
            arrDateTime[1] = arrDateTime[1].Replace(":", "-"); // 時間置換
 
            // Zip ファイルのパスの作成
            string zipPath = selfPath + arrDateTime[0] + "_" + arrDateTime[1] + ".zip";
 
            // パスワード作成
            int digits_num = 23;
            char[] chPass;
            chPass = PasswordRandomASCII(digits_num);
            string pass = string.Join("", chPass);
 
            // パスワード出力ファイルのパス作成
            string passPath = selfPath + arrDateTime[0] + "_" + arrDateTime[1] + ".pass";
 
            // ファイルドロップ以外の実行を拒絶する
            if (args.Length == 0)
            {
                return;
            }
 
            try
            {
                // Zip ファイルの作成
                using (ZipFile zip = new ZipFile(Encoding.GetEncoding("shift_jis")))
                {
                    // パスワードをかける
                    zip.Password = pass;
 
                    // ファイルの追加
                    for (int i = 0; i < args.Length; i++)
                    {
                        zip.AddFile(args[i], "");
                    }
 
                    // Zip ファイルを保存
                    zip.Save(zipPath);
                }
 
                // パスワードのファイル出力
                File.WriteAllText(passPath, pass);
            }
            catch
            {
                Console.WriteLine("Zip ファイルは作成できませんでした。");
                Console.ReadKey();
            }
        }
 
        // パスワード作成関数
        // アルファベットの A ~ z に対応するアスキーコードの 65 ~ 122
        // を返す関数
        static char[] PasswordRandomASCII(int digits_num)
        {
            // パスワード格納用配列
            char[] code = new char[digits_num];
 
            // 乱数発生関数の作成
            Random rnd = new Random();
 
            // 乱数作成
            for (int i = 0; i < digits_num; i++)
            {
                // 乱数発生させて、アスキーコードを文字変換して代入する
                // 乱数は 65 以上 123 未満
                code[i] = (char)rnd.Next(65, 123);
            }
           
            // 戻り値
            return code;
        }
    }
}

使い方

exe ファイルを好きなところに置いてファイルをドロップすれば zip ファイルが出来上がります。
なお、 zip ファイルは exe ファイルと同じディレクトリに出来上がります。



コメント

まぁ、使用頻度はあまり多くはありませんが、 C# の良い練習になりました。



以上