ネットサーフィンをしているときお気に入りの画像が見つかったのでフォルダに保存。ところがファイル名がバラバラ。
こんな状況(汗)
複数のファイル名を連番で一括で変更することはできないのでしょうか? またタイムスタンプも一括で変更する方法はないのでしょうか?
ファイル名を連番にする
ドラッグ&ドロップするだけでファイル名を連番になるように変更するアプリをつくります。実際には変更ではなくファイルをコピーして連番になるようにしています。
連番にするためにはなにかでソートする必要があります。ここではファイル名でソートします。あとは簡単。
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 |
public partial class Form1 : Form { public Form1() { InitializeComponent(); this.AllowDrop = true; this.DragOver += Form1_DragOver; this.DragDrop += Form1_DragDrop; } private void Form1_DragOver(object sender, DragEventArgs e) { e.Effect = DragDropEffects.All; } private void Form1_DragDrop(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.FileDrop)) { string[] files = (string [])e.Data.GetData(DataFormats.FileDrop); string filePath0 = files[0]; System.IO.FileInfo info = new System.IO.FileInfo(filePath0); string folderPath = info.DirectoryName; string outputFolderPath = folderPath + "\\output"; if (!System.IO.Directory.Exists(outputFolderPath)) System.IO.Directory.CreateDirectory(outputFolderPath); var sort = files.OrderBy(x => x); int i = 0; foreach (string file in sort) { System.IO.FileInfo info1 = new System.IO.FileInfo(file); string extension = info1.Extension; string outputFilePath = outputFolderPath + "\\" + i.ToString() + extension; System.IO.File.Copy(file, outputFilePath); i++; } } } } |
ドラッグ&ドロップができるように
1 |
this.AllowDrop = true; |
ドロップされたときに処理ができるように
1 2 |
this.DragOver += Form1_DragOver; this.DragDrop += Form1_DragDrop; |
としています。
あとは
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 |
private void Form1_DragOver(object sender, DragEventArgs e) { e.Effect = DragDropEffects.All; } private void Form1_DragDrop(object sender, DragEventArgs e) { // ドロップされたのはファイルか? if (e.Data.GetDataPresent(DataFormats.FileDrop)) { string[] files = (string [])e.Data.GetData(DataFormats.FileDrop); string filePath0 = files[0]; System.IO.FileInfo info = new System.IO.FileInfo(filePath0); string folderPath = info.DirectoryName; string outputFolderPath = folderPath + "\\output"; // ドラッグされたファイルが存在するフォルダ内にoutputフォルダをつくる if (!System.IO.Directory.Exists(outputFolderPath)) System.IO.Directory.CreateDirectory(outputFolderPath); // ドラッグされたファイルをファイルパスでソートする var sort = files.OrderBy(x => x); int i = 0; foreach (string file in sort) { System.IO.FileInfo info1 = new System.IO.FileInfo(file); // フォルダであれば無視 if (info1.Attributes.HasFlag(System.IO.FileAttributes.Directory)) continue; // 拡張子を取得 string extension = info1.Extension; // ファイルパスをつくる(00000 00001 00002 ~) string outputFilePath = outputFolderPath + "\\" + i.ToString("00000") + extension; // すでにファイルが存在するなら削除 if (System.IO.File.Exists(outputFilePath)) System.IO.File.Delete(outputFilePath); // ファイルをコピーする System.IO.File.Copy(file, outputFilePath); DateTime dt = new DateTime(2019, 1, 1, 0, 0, 0); // 2019年1月1日 0時0分0秒 ChangeTimeStamp(outputFilePath, dt); i++; } } } |
これでファイル名を連番に変更してファイルをコピーすることができます。
あとタイムスタンプも同じにしてしまいましょう。
1 2 3 4 |
void ChangeTimeStamp(string filePath, DateTime dt) { System.IO.File.SetLastWriteTime(filePath, dt); } |