【フォルダ整理】写真ファイルを親フォルダの名称を含んだファイル名で仕分けする Windows アプリケーションを公開してみる

写真ファイルを
親フォルダの名称を含んだファイル名で仕分けする
Windows アプリケーションを作成したため
皆さんの役に立てればと思い
ソースと本体を公開したいと思います。

[本体はこちら(BOOTH)](https://giftedstyle.booth.pm/items/5844806)
[本体はこちら(Google Drive)](https://drive.google.com/file/d/1zSRkrPwh3v2tfSaB-CDHbnWsZGqbp-mm/view?usp=sharing)

***

このアプリケーションの説明

画像ファイルを仕分けしたいフォルダを 1 箇所にまとめて
そのフォルダごとドラッグ＆ドロップする事で
仕分けを実施できます。

このアプリケーションの特徴は
ファイル名に親フォルダのフォルダ名が含まれる点です。
仕分け後のファイルがどのフォルダに属していたか分かるのです。

例えば「仕分け」フォルダに
「人物画」「風景画」「その他」
フォルダを作って画像を入れて
「仕分け」フォルダ自体をドラッグ＆ドロップすることで
「更新日_フォルダ名.png」が生成されるイメージです。

例えば「人物画」フォルダに入ったファイルは
「更新日_人物画.png」になります。

更新日のフォーマットは
「年月日_時分秒_ID」です。
ID 部分は同じ「年月日_時分秒」があった場合に
1, 2, 3 と異なるものになります。

png ファイルと
jpg ファイルのみが対象です。

![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3752886/adbad7fc-7613-839e-7454-34b9cfdda8be.png)
![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3752886/004177a8-8237-4aa3-ec97-7a2bbec669f2.png)
![image3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3752886/5848c511-ca53-7c9f-5212-0c480172a826.png)
![image4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3752886/4d2c3f74-05cf-44fa-2c8e-61b8d2e5908a.png)
![image5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3752886/6ef951bd-254b-ba85-fc45-da8d4be41d5b.png)

***

このアプリケーションのソースコード

Visual Studio の Windows フォームで作成しています。
ソースコードは下記の内容です。

```Csharp:使用したコード
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 を活用してみては
いかがでしょうか？

皆さんの開発の助けになれますように
閲覧ありがとうございました。