ユーザーコントロールのソースコードは既に説明しましたので、今回はMainFormに関する全ソースの掲載とイベントハンドラ、メソッドの説明をしたいと思います。
全体のソースコード
全体のソースコードは以下の通りです。
今回は「CSV結合ツールを自作しよう!(バージョンアップ編)」を簡略化したようなソースコードになっています。
全体に軽く目をとおして頂いてから、詳細の解説をお読みいただければより分かりやすいと思います。
尚、Visual Studio 2019 のプロジェクトファイル一式は、下記からダウンロードできますので、入力が面倒という方はご利用ください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; namespace CharCodeChanger { public partial class MainForm : Form { public MainForm() { InitializeComponent(); } private void MainForm_Load(object sender, EventArgs e) { //文字コードの選択項目を配列として保持 var charcode = new string[] { "shift-jis", "utf-8" }; //文字コード選択用コンボボックスに選択項目を登録 uxTargeCharCode.Items.AddRange(charcode); uxOutputCharCode.Items.AddRange(charcode); //文字コード選択用コンボボックスに対して最初の項目を選択済みにしておく uxTargeCharCode.SelectedIndex = 0; uxOutputCharCode.SelectedIndex = 0; } /// <summary> /// 変換実行ボタンクリック時の処理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void uxExecute_Click(object sender, EventArgs e) { if(! File.Exists(uxTargetFile.FileName) || uxOutputFile.FileName.Trim() == "") { return; } //ファイルコピーメソッドの呼び出し CopyFile(uxTargetFile.FileName, uxOutputFile.FileName, uxTargeCharCode.Text, uxOutputCharCode.Text); } /// <summary> /// ファイルコピーメソッド /// </summary> /// <param name="sourceName"></param> /// <param name="destName"></param> /// <param name="sourceCharCode"></param> /// <param name="destCharCode"></param> private void CopyFile(string sourceName,string destName,string sourceCharCode,string destCharCode) { //変換元ファイルの文字コード取得 var target_enc = Encoding.GetEncoding(sourceCharCode); //変換後ファイルの文字コード取得 var output_enc = Encoding.GetEncoding(uxOutputCharCode.Text); //変換後ファイルを上書きモードでオープン using (StreamWriter sw = new StreamWriter(destName, false, output_enc)) { //変換元ファイルを読み込みモードでオープン using (StreamReader sr = new StreamReader(sourceName, target_enc)) { //ファイルの終わりに達するまでループ while (!sr.EndOfStream) { //1行読み込み var line = sr.ReadLine(); //出力ファイルに書き込む sw.WriteLine(line); } } } } } } |
先頭のusing 宣言
今回もファイルへの読み書きが発生するため、先頭の10行目に using System.IO を手動で追加しています。
1 2 3 4 5 6 7 8 9 10 |
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; |
コンストラクタ
CSV結合ツールでは、文字コード選択用ComboBoxの初期化(選択項目の追加)をコンストラクタに記述していました。
今回はその記述をコンストラクタではなく、 Load イベントハンドラに記述していますので、コンストラクタは自動生成された状態になっています。
何故コンストラクタからLoadイベントハンドラに移したかについては、特別な理由はありません。
どちらに記述しても良いのですが、今回はLoadイベントハンドラの説明をしたかったので、こちらに移した次第です。
Loadイベントハンドラ
このイベントハンドラの事を、「フォームロード」と呼んだりしています。
コンストラクタはインスタンスが生成された最初に1度だけ呼び出されるのに対し、Windowフォーム(Formクラス)が初めて表示される時に呼び出されます。
複数のWindowフォームに対して表示や非表示を行う場合、プログラムの書き方によってはLoadイベントが複数発生する場合もありますが、多くの場合はどちらに記述してもさほど変わりません。
画面に関する初期処理はLoadイベントに書く事も多いので、今回はLoadイベントを使うことにしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
private void MainForm_Load(object sender, EventArgs e) { //文字コードの選択項目を配列として保持 var charcode = new string[] { "shift-jis", "utf-8" }; //文字コード選択用コンボボックスに選択項目を登録 uxTargeCharCode.Items.AddRange(charcode); uxOutputCharCode.Items.AddRange(charcode); //文字コード選択用コンボボックスに対して最初の項目を選択済みにしておく uxTargeCharCode.SelectedIndex = 0; uxOutputCharCode.SelectedIndex = 0; } |
CSV結合ツールからコピーしてきたので、内容は同じです。
実行ボタンクリックイベント
ここでは、変換元ファイル名を選択するユーザーコントロール(uxOutputFile)と変換後ファイル名を選択するユーザーコントロール(uxTargetFile)のFileNameプロパティが有効か否かをチェックして、どちらかが有効でなければ処理を抜ける(returnする)ようにしています。
有効か否かについては、変換元ファイル名が存在しないか、変換後ファイル名が空文字(未入力)であるかどうかで判断しています。
uxOutputFile.FileName.Trim() の Tirm() は文字列クラスのメソッドで、前後の空白文字を除去するメソッドです。
これを入れておかないと、空白が入力された場合も正しく入力されたと判定され、ファイルオープン時にエラーとなってしまいます。
1 2 3 4 5 6 7 8 9 10 |
private void uxExecute_Click(object sender, EventArgs e) { if(! File.Exists(uxTargetFile.FileName) || uxOutputFile.FileName.Trim() == "") { return; } //ファイルコピーメソッドの呼び出し CopyFile(uxTargetFile.FileName, uxOutputFile.FileName, uxTargeCharCode.Text, uxOutputCharCode.Text); } |
最後にCopyFileというメソッドを読んでいますが、これは今回用で作成した自作の文字コード変換機能付きファイルコピー処理です。
文字コード変換機能付きファイルコピー処理
今回の要になる部分です。
処理の概要フローを掲載しておきます。
これは「ファイル文字コード変換ツールを自作しよう(第1回・概要編)」に掲載したものと同じフローです。

このフローに基づいてメソッド化したプログラムがCopyFileメソッドです。
他のプログラムに流用することを想定し関数化(メソッド化)しました。
引数として以下の4つが指定出来る様になっています。
- 変換元ファイル名
- 変換後ファイル名
- 変換元ファイルの文字コード
- 変換後ファイルの文字コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
private void CopyFile(string sourceName,string destName,string sourceCharCode,string destCharCode) { //変換元ファイルの文字コード取得 var target_enc = Encoding.GetEncoding(sourceCharCode); //変換後ファイルの文字コード取得 var output_enc = Encoding.GetEncoding(uxOutputCharCode.Text); //変換後ファイルを上書きモードでオープン using (StreamWriter sw = new StreamWriter(destName, false, output_enc)) { //変換元ファイルを読み込みモードでオープン using (StreamReader sr = new StreamReader(sourceName, target_enc)) { //ファイルの終わりに達するまでループ while (!sr.EndOfStream) { //1行読み込み var line = sr.ReadLine(); //出力ファイルに書き込む sw.WriteLine(line); } } } } |
ここに登場するStreamReader、StreamWriteクラスや using については、「CSV結合ツールを自作しよう!(バージョンアップ編)」の記事に説明していますので、そちらをご覧ください。
単にファイルをコピーするだけなら、 FileクラスのCopyFileメソッドが利用可能ですが、今回は文字コードを指定する必要があるため、自作となりました。
プログラムを配布するには
プログラムを他のPCへコピーして使う方法(配布方法)は、「CSV結合ツールを自作しよう!(最終回・プログラムの配布編)」の記事の中で、具体的な操作方法や注意点を解説しています。
フォルダ名やファイル名を読み替えて、必要なファイル3~4個をコピーして頂ければ他のWIndows10 PCで動かすことが出来ます。
まとめ
今回はファイル文字コード変換ツールの全ソースコードの掲載と解説を行いました。
CSV結合ツールの記事を読んでいただいていれば、今回は簡単な内容だと思います。
ここで紹介した CopyFileメソッドはシンプルなので、用途に応じてカスタマイズして頂けますし、まそれをメソッド化することで、資産として増やすことにもなります。
資産が増えていくとプログラムがより簡単に作れるようになりますので、どんどん増やしていきましょう。