C# (2) - 変換.tokyo | henkan.tokyo

【C#】フォームで [Enter] キーが押された時にフォーカスを遷移させる


■【C#】フォームで [Enter] キーが押された時にフォーカスを遷移させる


汎用機のように [Enter] キーで入力フィールドを遷移させる方法です。

方法としては、フォームの KeyPreview を true にしてフォームで一括処理するのが楽かと思います。というよりは、各コントロールのキーイベントで実装すると、保守性が悪くなります。ちなみに、MultiLine なテキストボックスで改行を [Ctrl] + [Enter] で代用できるように考慮しています。

利用の際には KeyPreview を true にしておいてください。


■サンプルコード

// [Enter] キーで次の TabIndex があるコントロールへフォーカスを移す

private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) {

if (e.KeyCode == Keys.Enter) {

if (! e.Control) {

this.SelectNextControl(this.ActiveControl, ! e.Shift, true, true, true);

}

}

}


// フォーカス遷移後の音を消すためにキーイベントが処理されたことにする

private void Form1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e) {

if (e.KeyChar == (char)Keys.Enter) {

e.Handled = true;

}

}


【C#】現在の日付と時刻を取得する


■【C#】現在の日付と時刻を取得する

・現在の日付と時刻を取得するための記述です。


【サンプルコード】

// 現在の日時を取得

string A = DateTime.Now.ToString() ; // "2003/01/16 12:08:41"

string B = DateTime.Now.ToString("F") ; // "2003年1月16日 12:08:41"

string C = DateTime.Today.ToString() ; // "2003/01/16 00:00:00"

int D = DateTime.Today.Year ; // 2003 (年)

int E = DateTime.Today.Month ; // 1 (月)

int F = DateTime.Today.Day ; // 16 (日)

string G = DateTime.Today.DayOfWeek.ToString() ; // "Thursday"

string H = DateTime.Now.TimeOfDay.ToString() ; // "12:08:41.3146250"

--------------------------------------------------------------------------------

// 基準日との日時差を計算

DateTime J = new DateTime(1995, 1, 1) ; // 基準日

TimeSpan K = DateTime.Now - J ; // 日時差の計算

double L = K.TotalHours ; // 70500.1448052778 (時間の差)

double M = K.TotalDays ; // 2937.50603355324 (日の差)

int N = K.Days ; // 2937 (日の差 @端数なし)


【C#】現在の日付と時刻を取得する


■【C#】現在の日付と時刻を取得する


サンプルソース

// 現在の日時を取得

string A = DateTime.Now.ToString() ; // "2003/01/16 12:08:41"

string B = DateTime.Now.ToString("F") ; // "2003年1月16日 12:08:41"

string C = DateTime.Today.ToString() ; // "2003/01/16 00:00:00"

int D = DateTime.Today.Year ; // 2003 (年)

int E = DateTime.Today.Month ; // 1 (月)

int F = DateTime.Today.Day ; // 16 (日)

string G = DateTime.Today.DayOfWeek.ToString() ; // "Thursday"

string H = DateTime.Now.TimeOfDay.ToString() ; // "12:08:41.3146250"

--------------------------------------------------------------------------------

// 基準日との日時差を計算

DateTime J = new DateTime(1995, 1, 1) ; // 基準日

TimeSpan K = DateTime.Now - J ; // 日時差の計算

double L = K.TotalHours ; // 70500.1448052778 (時間の差)

double M = K.TotalDays ; // 2937.50603355324 (日の差)

int N = K.Days ; // 2937 (日の差 @端数なし)























【C#】C#でZIPファイルを扱えるDotNetZip

C#でZIPファイルを扱えるDotNetZip


サイズが大きいファイルを扱うアプリケーションでは、ZIP形式にてファイルを圧縮できると便利ですよね。

ASP.netで、条件で絞り込んだファイル群を一括ダウンロードさせる、という要望が出て来ました。

そこで今回はDotNetZipというライブラリを紹介します。

DotNetZipを利用すると、.NET環境でZIPファイルを容易に作成し、解凍できるようになります。DotNetZipには高度な機能(パスワード設定、自己解凍書庫、圧縮レベル設定、ZIP64、AES-256bit暗号化等)が備わっているため、ZIPファイルに対する様々な操作を行えるようになります。

DotNetZipとは

DotNetZipはCodePlexにて、オープンソース(Ms-PLライセンス)として開発されています。.NET (Compact) Framework2.0以上の環境で動作するため、ASP.NET、Windowsフォーム、スマートデバイス等の開発で使用できます。

DotNetZipのWebサイト

DotNetZipはCodeplexから入手できます。

DotNetZipはC#、VB.NET、IronPython、PowerShellといった.NET対応言語で利用できます。「DotNetZipLib-Runtime-v1.8.msi」にてインストールすれば、PHP、Perl、VBScript(ASP)、JavaScript、Visual Basic、VBAからも利用できます(詳細はヘルプファイルの「DotNetZip can be used from COM Environments」をご覧ください)。 また「DotNetZipUtils-v1.8.msi」は、DotNetZipの実装サンプルとして参考になるでしょう。

DotNetZipUtils(ユーティリティアプリケーション)

ZIPファイルを作成する

それでは、Windowsアプリケーションのコード例を見ていきましょう。本稿では「DotNetZipLib-Runtime-v1.8.zip」をダウンロードし、DotNetZip-v1.8フォルダの「Ionic.Zip.dll」に参照設定を行っています。このDLLには、Zipファイルを操作する機能(Ionic.Zip名前空間)とデータの圧縮伸張を行うZlibの.NET版(Ionic.Zlib名前空間)が含まれています。

ZIPファイルを生成するコード(C#)

//クラスの先頭で名前空間をインポート
using Ionic.Zip;
using Ionic.Zlib;
(中略)
private void button1_Click(object sender, EventArgs e)
{
try
{
//(1)ZIPクラスをインスタンス化
using (ZipFile zip = new ZipFile(Encoding.GetEncoding("shift_jis")))
{
//(2)圧縮レベルを設定
zip.CompressionLevel = CompressionLevel.BestCompression;
//(3)ファイルを追加
zip.AddFile(@"C:\ZipSample\ファイル1.txt");
//ファイルを追加(画像フォルダ)
zip.AddFile(@"C:\ZipSample\ファイル2.bmp", "画像");
//(4)ディレクトリを追加する場合
//zip.AddDirectory(@"C:\追加したいフォルダ");
//(5)ZIPファイルを保存
zip.Save(@"C:\ZipSample\サンプル.zip");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message,"ZIP作成失敗");
}
}

生成されるZIPファイルの階層は下図の通りです。

ZIPファイルの階層

プログラムの流れを順に見ていきましょう。

(1)最初にZipFileクラスをインスタンス化します。日本語ファイル名を扱うためコンストラクタにてエンコーディング「shift_jis」を指定しています。ZipFileクラスは名前の通り、ZIPファイル(書庫そのもの)を表すクラスです。

(2)次に圧縮方法を指定します。CompressionLevelにて、None(圧縮なし)、BestSpeed(速度最優先)、Default(速度と圧縮率のバランス)、BestCompression(圧縮率最優先)、Level0-9(圧縮なし-圧縮率最優先)を選択できます。

ここではBestCompressionを選んだため、2Mのビットマップファイルが60Kに圧縮されました。Windows標準機能を使って圧縮した場合は65K程度だったため、まずまずの圧縮率と言えるでしょう。

(3)続けて、書庫に追加するファイルをAddFileメソッドで指定します。第2引数にて書庫内のパスを指定することもできます。例えば、""と指定すると書庫のルートに配置されます。第2引数を指定しない場合は、元のフォルダ構成で配置されます。

(4)もしファイルを個々に指定するのではなく、ディレクトリごとに指定したい場合は、AddDirectoryメソッドを使用します。

(5)最後にSaveメソッドを呼び出します。ここで指定したパスにZIPファイルが出力されます。


ZIPファイルを解凍する

続けて、ZIPファイルを解凍するコードを見ていきましょう。

ZIPファイルを解凍するコード

//(1)ZIPファイルを読み込み
using (ZipFile zip = ZipFile.Read(@"C:\ZipSample\サンプル.zip",
Encoding.GetEncoding("shift_jis")))
{
//(2)解凍時に既にファイルがあったら上書きする設定
zip.ExtractExistingFile = ExtractExistingFileAction.OverwriteSilently;
//(3)全て解凍する
zip.ExtractAll(@"C:\Work");
//(4)ZIP内のファイルを順に取り出す場合
//foreach (ZipEntry entry in zip)
//{
// //ファイル名を出力
// Console.WriteLine(entry.FileName);
// //個々に解凍
// entry.Extract(@"C:\Work");
//}
}

解凍する手順は次の通りです。

(1)まずReadメソッドを利用してZIPファイルを読み込みます。引数にはZIPファイルのパスとエンコーディングを指定します。
(2)ExtractExistingFileプロパティには、解凍時に同名ファイルがある場合の設定を行います。初期設定では例外がスローされますが、ここではそのまま上書きするように変更しています。
(3)最後にExtractAllメソッドで解凍します。引数に指定したパスに書庫内の全ファイルが解凍されます。
(4)もし、書庫の中に含まれるファイルに個別にアクセスしたい場合は、ZipEntryクラスを使用できます。ZipEntryクラスは書庫内のファイルを表すクラスです。


書庫内のファイルを操作する

続けて、書庫中のファイルをリネームして削除するコードを見てみましょう。

ZIPファイルを変更するコード

using (ZipFile zip = ZipFile.Read(@"C:\ZipSample\サンプル.zip",
Encoding.GetEncoding("shift_jis")))
{
//(1)リネーム:「ファイル2.bmp」の名前を「イラスト.bmp」に変更
ZipEntry entry = zip[@"画像\ファイル2.bmp"];
entry.ProvisionalAlternateEncoding = Encoding.GetEncoding("shift_jis");
entry.FileName = @"画像\イラスト.bmp";
//(2)削除:「ファイル1.txt」を取り除く
zip[@"ZipSample\ファイル1.txt"] = null;
//(3)ZIPファイルを上書保存
zip.Save();
}

書庫を更新する手順は次の通りです。

(1)ファイル名を変更するには、対象ファイルを指定して、一旦ZipEntryクラスに代入します。続けてProvisionalAlternateEncodingプロパティにエンコーディングを設定した後、FileNameプロパティに新しいファイル名を指定します。
(2)ファイルを削除する場合は、ZipFileクラスでファイル名を指定してnullを代入します。
(3)最後にSaveメソッドを呼び出してZIPファイルを更新します。


ASP.NETでの利用

続けて、ASP.NETのページから動的にZIPファイルを生成するコードを見てみましょう。

ASP.NETでZIPファイル(data.zip)を生成

protected void LinkButton1_Click(object sender, EventArgs e)
{
Response.Clear();
Response.ContentType = "application/zip";
Response.AddHeader("content-disposition", "filename=data.zip");
using (ZipFile zip = new ZipFile(Encoding.GetEncoding("shift_jis")))
{
const string sales = "去年,3000円\r\n今年,5000円";
//(1)文字列からファイルを追加
zip.AddEntry("データ.csv", "", sales);
//(2)ダウンロード出力
zip.Save(Response.OutputStream);
}
}

ASP.NETでは、次の手順でZIPファイルを出力します。

(1)AddEntryメソッドは、文字列、ストリーム、バイト配列からファイルを生成して追加できます。このため、物理ファイルが存在していなくても書庫にファイルを追加できます。ここでは、文字列からファイルを生成しています(もちろん、これまで紹介したAddFileメソッドやAddDirectoryメソッドも利用できます)。
(2)WindowsフォームのサンプルではSaveメソッドの引数にファイルパスを指定していましたが、ASP.NETでは引数に「Response.OutputStream」を指定します。これによってブラウザにZIPファイルを出力することができます。

自己解凍書庫などの高度な機能を使う

最後に、様々なオプションを用いたサンプルを示しておきます。次のコードでは、パスワード付きの自己解凍書庫を作成しています(各プロパティの詳細についてはヘルプファイルをご覧ください)。

自己解凍書庫を生成するコード

//ZIPクラスをインスタンス化
using (ZipFile zip = new ZipFile(Encoding.GetEncoding("shift_jis")))
{
//パスワード設定
zip.Password = "pass";
//暗号方式を設定(AES-256bit暗号化)
zip.Encryption = EncryptionAlgorithm.WinZipAes256;
//4G以上のファイルがある時には、ZIP64を使用
zip.UseZip64WhenSaving = Zip64Option.AsNecessary;
//必要に応じてUnicodeを使用(自己解凍ウィンドウの文字化け対策)
zip.UseUnicodeAsNecessary = true;
//拡張子「txt」のファイルを再帰的に追加
zip.AddSelectedFiles("*.txt",@"C:\ZipSample\",true);
//圧縮せずにファイルを追加(MP3やJPEG等)
zip.ForceNoCompression = true;
zip.AddFile(@"C:\ZipSample\ファイル2.jpg");
//書庫にコメントを設定
zip.Comment = "DotNetZip Sample";
//自己解凍形式で出力(WinFormアプリ:ダブルクリックして実行)
zip.SaveSelfExtractor(@"C:\ZipSample\サンプル.exe",
SelfExtractorFlavor.WinFormsApplication);
//自己解凍形式で出力(コンソールアプリ:サンプル.exe -p passのように実行)
//zip.SaveSelfExtractor(@"C:\ZipSample\サンプル.exe",
// SelfExtractorFlavor.ConsoleApplication, @"C:\Temp\ZipOutput");

ZipFileクラスのまとめ

本稿で紹介したZipFileクラスのメンバを整理しておきます。

ZipFileクラスの主要なメソッドとプロパティ

メンバ説明初期値
AddDirectoryディレクトリを追加する-
AddEntryエントリを追加する-
AddFileファイルを追加する-
AddSelectedFiles複数ファイルを追加する-
ExtractAll全ファイルを解凍する-
ReadZIPを読み込む-
SaveZIPを保存する-
SaveSelfExtractor自己解凍形式で保存する-
Commentコメントなし
CompressionLevel圧縮レベルDefault(Level6)
Encryption暗号化方式PkzipWeak
ExtractExistingFile解凍時の重複設定Throw
ForceNoCompression圧縮を行わないfalse
Passwordパスワードなし
UseUnicodeAsNecessary必要時にUnicode使用false
UseZip64WhenSavingZIP64の使用Never

DotNetZipでは、ZipFileクラスのプロパティ設定のタイミングが出力結果に影響を与えることがあります。例えば、CompressionLevelプロパティを設定する場合、設定前に追加したファイルと、設定後で追加したファイルでは圧縮率が異なります。この点に注意してプログラミングをすると良いでしょう。

最後に

.NET環境でZipファイルを扱う方法としては、SharpZipLibや.NET3.0で追加されたZipPackageクラスも存在します。

DotNetZipは機能が豊富で利用しやすく、ASP.netでの利用にも最適です。一括ダウンロード機能をお考えの際には、一つの選択肢にされてはいかがでしょうか?



読者の皆様、日々の開発業務、どうもお疲れ様です!
いろいろ試してみましたが、疲れたときにはやっぱりこれが一番元気出るんですよね。
カフェイン多めで眠気スッキリ。味も美味しいですし♪
アサヒのMONSTER飲んで、今日も乗り切りましょう!

フォームに自動スクロールバーを付ける

フォームに自動スクロールバーを付けるには、AutoScroll プロパティを true に設定します。フォームのクライアント領域外にコントロールがあれば、自動でスクロールバーが付くようになります。

通常は、デザイナで初期値として設定します。


// フォームに自動スクロールバーを付ける
this.AutoScroll = true;