タイトルのとおりドラッグ&ドロップするだけで複数行を置換できるアプリケーションをつくってみましょう。
普通のテキストエディタであれば文字列を置換する機能は搭載されています。しかし複数行を置換できるものは少ないです。
探せばいくらでもあるのかもしれませんが、VisualStudio Communityがあるのですから、ここは自作してみましょう。ファイルを開いてエディタで編集する必要はありません。D&Dだけでファイルを保存するところまでやってもらいます。
では、デザイナをつかって以下のようなものを作ります。左にあるのはPanel 右にあるのはテキストボックスです。
まずコンストラクタ内で
1 2 3 4 5 6 7 8 9 10 |
public Form1() { InitializeComponent(); panel1.AllowDrop = true; panel1.DragOver += Panel1_DragOver; panel1.DragDrop += Panel1_DragDrop; } |
そしてドラッグオーバーされたら
1 2 3 4 5 6 7 8 9 |
private void Panel1_DragOver(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.FileDrop)) { e.Effect = DragDropEffects.All; } } |
そしてドロップされたら
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 |
private void Panel1_DragDrop(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.FileDrop)) { // これでドロップされたファイルのパスを取得する string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); // ファイルを保存するフォルダをつくる(「output」フォルダをつくる) FileInfo info = new FileInfo(files[0]); string dir = info.Directory.FullName; string outputFolder = dir + "\\output\\"; Directory.CreateDirectory(outputFolder); foreach (string filePath in files) { FileInfo info1 = new FileInfo(filePath); // ドロップされたものがフォルダであればなにもしない if (info1.Attributes.HasFlag(FileAttributes.Directory)) continue; // 出力ファイル名 string outputFilePath = outputFolder + info1.Name; // 置換の処理 RepleceString(filePath, outputFilePath, textBox1.Text, textBox2.Text); } } } |
出力先のフォルダを作成して、置換後のデータを保存するファイル名を取得し、そのあとRepleceStringという自作メソッドでファイルを開いて文字列の置換を行なっています。もしフォルダがドロップされた場合、なにもしないようにしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
void RepleceString(string filePath, string outputFilePath, string text1, string text2) { // ファイルを開いてデータを読み取る StreamReader sr = new StreamReader(filePath); string fileData = sr.ReadToEnd(); sr.Close(); // 置換してファイルを保存する string newFileData = fileData.Replace(text1, text2); StreamWriter sw = new StreamWriter(outputFilePath); sw.Write(newFileData); sw.Close(); } |
ところが文字コードはUTF-8にしか対応していません。そこで少し拡張してみます。
ラジオボタンをつけて
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
void RepleceString(string filePath, string outputFilePath, string text1, string text2) { // ファイルを開いてデータを読み取る Encoding encoding = Encoding.UTF8; if (radioButtonSJIS.Checked) encoding = Encoding.GetEncoding("SJIS"); StreamReader sr = new StreamReader(filePath, encoding); string fileData = sr.ReadToEnd(); sr.Close(); // 置換してファイルを保存する string newFileData = fileData.Replace(text1, text2); StreamWriter sw = new StreamWriter(outputFilePath, false, encoding); sw.Write(newFileData); sw.Close(); } |
個人的にはShift_JISとUTF-8しか使いません。それ以外のものを使う方は拡張してみてください。