写真ファイルを
親フォルダの名称を含んだファイル名で仕分けする
Windows アプリケーションを作成したため
皆さんの役に立てればと思い
ソースと本体を公開したいと思います。
本体はこちら(BOOTH)
本体はこちら(Google Drive)
このアプリケーションの説明
画像ファイルを仕分けしたいフォルダを 1 箇所にまとめて
そのフォルダごとドラッグ&ドロップする事で
仕分けを実施できます。
このアプリケーションの特徴は
ファイル名に親フォルダのフォルダ名が含まれる点です。
仕分け後のファイルがどのフォルダに属していたか分かるのです。
例えば「仕分け」フォルダに
「人物画」「風景画」「その他」
フォルダを作って画像を入れて
「仕分け」フォルダ自体をドラッグ&ドロップすることで
「更新日_フォルダ名.png」が生成されるイメージです。
例えば「人物画」フォルダに入ったファイルは
「更新日_人物画.png」になります。
更新日のフォーマットは
「年月日_時分秒_ID」です。
ID 部分は同じ「年月日_時分秒」があった場合に
1, 2, 3 と異なるものになります。
png ファイルと
jpg ファイルのみが対象です。
このアプリケーションのソースコード
Visual Studio の Windows フォームで作成しています。
ソースコードは下記の内容です。
using System.ComponentModel;
using System.IO;
using System.IO.Compression;
using System.Text;
namespace SephirothOrganizationPhotogram
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void panel1_Paint(object sender, PaintEventArgs e)
{
}
private void panel1_DragDrop(object sender, DragEventArgs e)
{
if (e.Data == null)
{
return;
}
object? data = e.Data.GetData(DataFormats.FileDrop, false);
if(data == null)
{
return;
}
List<string> rootList = new List<string>();
List<string> targetList = new List<string>();
foreach (string rootFolderName in (string[])data)
{
if(!System.IO.Directory.Exists(rootFolderName))
{
continue;
}
string targetDirectory = rootFolderName + "_Organized";
if (!System.IO.Directory.Exists(targetDirectory))
{
System.IO.Directory.CreateDirectory(targetDirectory);
}
foreach (string oneTargetFileName in Directory.GetFiles(rootFolderName, "*", System.IO.SearchOption.AllDirectories))
{
if(!oneTargetFileName.EndsWith("png") && !oneTargetFileName.EndsWith("jpg"))
{
continue;
}
string extention = ".png";
if(oneTargetFileName.EndsWith("jpg"))
{
extention = ".jpg";
}
DateTime targetDateTime = System.IO.File.GetLastWriteTime(oneTargetFileName);
string parentName = oneTargetFileName.Substring(0, oneTargetFileName.LastIndexOf("\\"));
parentName = parentName.Substring(parentName.LastIndexOf("\\") + 1);
string result = targetDirectory + "\\" + targetDateTime.ToString("yyyyMM") + "\\" + targetDateTime.ToString("yyyyMMdd_HHmmss") + "_";
int count = 1;
for(int i = 0; i < targetList.Count; i++)
{
if (targetList[i] == result + count + parentName + extention)
{
count++;
}
}
result += count + parentName + extention;
if(!System.IO.Directory.Exists(targetDirectory + "\\" + targetDateTime.ToString("yyyyMM")))
{
System.IO.Directory.CreateDirectory(targetDirectory + "\\" + targetDateTime.ToString("yyyyMM"));
}
rootList.Add(oneTargetFileName);
targetList.Add(result);
}
}
if(rootList.Count != targetList.Count)
{
MessageBox.Show(
"エラー1が発生したため、安全性を考慮して何も処理を行わずに終了しました。", "確認",
MessageBoxButtons.OK, MessageBoxIcon.Question
);
return;
}
for(int i = 0; i < targetList.Count; i++)
{
if (System.IO.File.Exists(targetList[i]))
{
MessageBox.Show(
"移動しようとしているファイルが既に存在しているため、安全性を考慮して何も処理を行わずに終了しました。", "確認",
MessageBoxButtons.OK, MessageBoxIcon.Question
);
return;
}
}
for (int i = 0; i < targetList.Count; i++)
{
for (int j = i + 1; j < targetList.Count; j++)
{
if (targetList[i] == targetList[j])
{
MessageBox.Show(
"エラー2が発生したため、安全性を考慮して何も処理を行わずに終了しました。", "確認",
MessageBoxButtons.OK, MessageBoxIcon.Question
);
return;
}
}
}
for (int i = 0; i < rootList.Count; i++)
{
if (!System.IO.Directory.Exists(rootList[i].Substring(0, rootList[i].LastIndexOf("\\"))))
{
MessageBox.Show(
"エラー3が発生したため、安全性を考慮して何も処理を行わずに終了しました。", "確認",
MessageBoxButtons.OK, MessageBoxIcon.Question
);
return;
}
}
for (int i = 0; i < targetList.Count; i++)
{
if (!System.IO.Directory.Exists(targetList[i].Substring(0, targetList[i].LastIndexOf("\\"))))
{
MessageBox.Show(
"エラー4が発生したため、安全性を考慮して何も処理を行わずに終了しました。", "確認",
MessageBoxButtons.OK, MessageBoxIcon.Question
);
return;
}
}
for (int i = 0; i < targetList.Count; i++)
{
System.IO.File.Copy(rootList[i], targetList[i]);
}
MessageBox.Show(
"仕分けが完了しました。", "確認",
MessageBoxButtons.OK, MessageBoxIcon.Question
);
return;
}
private void panel1_DragEnter(object sender, DragEventArgs e)
{
if(e.Data == null)
{
return;
}
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
e.Effect = DragDropEffects.All;
}
else
{
e.Effect = DragDropEffects.None;
}
}
}
}
以上 Windows アプリケーションを公開しました。
Visual Studio の Windows フォームは
フォルダ整理をしたい時等に
補助用のアプリケーションを
簡単に作成する事ができます。
皆さんもフォルダ整理の際は
Visual Studio を活用してみては
いかがでしょうか?
皆さんの開発の助けになれますように
閲覧ありがとうございました。