こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。
この記事の目次
目的
前の記事で、ファイルをドロップしたら 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 の通りに検索しました。
検索結果は図2 の通りです。1番上のWebページを開きます。

図3 の画面が表示されたら、『Tools』をクリックします。

『Tools』の中の『Ionic.Zip.dll』をクリックします。

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

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

visual studio で参照設定を行った画面です。

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

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

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

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


ILMerge.exe を指定します。

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

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

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

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

関数
ソースコード
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# の良い練習になりました。
以上