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 の通りに検索しました。検索結果は図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# の良い練習になりました。
以上