ファイル仕分けアプリ【C#】

目次

経緯

ルーティンワークでファイルを別々のフォルダに仕分けする作業があった。

ファイルをいちいち貼り付ける作業がめんどくさいので、

C#でファイルを仕分けするアプリをつくってみました。

仕様

仕様は以下の通りです。

  • ファイルを選んで、実行ボタンを押すとファイルが仕分けされる。
  • フォルダはダイアログでフォルダを選択する方法と、フォルダをドラックドロップする方法がある。

レイアウト

レイアウトは以下の通りです。

左上にあるのがそれです。

ラベルは「出力用:」「保存先:」とあります。

テキストボックスは「出力用:」と「保存先:」のラベルの隣にあります。

ボタンは「選択」というのが2つあります。ボタンを押すとダイアログが出てきて、ファルダを選択します。

あと、「実行」ボタンもあります。クリックすると仕分けが始まります。

コード

「出力用」に仕分け前のフォルダを選択してください。

「保存先」仕分け後のフォルダを選択してください。ファイルが仕分けされます。保存先のフォルダには「csv」「xlsx」「その他」とフォルダがある想定です。

仕分け後「出力用」で選んだフォルダは空になります。

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 EPMAのファイル分別アプリ
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            // ドラッグアンドドロップの設定
            textBox_outputfolder.AllowDrop = true;
            textBox_outputfolder.DragEnter += new DragEventHandler(textbox_outputfolder_DragEnter);
            textBox_outputfolder.DragDrop += new DragEventHandler(textbox_outputfolder_DragDrop);

            // textBox_savefolderのドラッグアンドドロップ設定
            textBox_savefolder.AllowDrop = true;
            textBox_savefolder.DragEnter += new DragEventHandler(textBox_savefolder_DragEnter);
            textBox_savefolder.DragDrop += new DragEventHandler(textBox_savefolder_DragDrop);


        }

        private void textbox_outputfolder_DragEnter(object sender, DragEventArgs e)
        {
            // ドラッグされたデータがファイルまたはディレクトリの場合のみドロップを許可
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
                e.Effect = DragDropEffects.Copy;
            else
                e.Effect = DragDropEffects.None;
        }

        private void textbox_outputfolder_DragDrop(object sender, DragEventArgs e)
        {
            // ドラッグされたファイル/フォルダのパスを取得
            string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);

            // 最初のパスがディレクトリであれば、テキストボックスに設定
            if (files != null && files.Length > 0 && Directory.Exists(files[0]))
            {
                textBox_outputfolder.Text = files[0];
            }
        }

        private void button_choose_outputfolder_Click(object sender, EventArgs e)
        {
            using (FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog())
            {
                folderBrowserDialog.Description = "出力用のフォルダを選択してください。";

                // ダイアログを表示
                DialogResult result = folderBrowserDialog.ShowDialog();

                // ユーザーがフォルダを選択した場合
                if (result == DialogResult.OK && !string.IsNullOrWhiteSpace(folderBrowserDialog.SelectedPath))
                {
                    // テキストボックスにフォルダのパスを設定
                    textBox_outputfolder.Text = folderBrowserDialog.SelectedPath;
                }
            }
        }


        // textBox_savefolderのDragEnterイベントハンドラ
        private void textBox_savefolder_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
                e.Effect = DragDropEffects.Copy;
            else
                e.Effect = DragDropEffects.None;
        }

        // textBox_savefolderのDragDropイベントハンドラ
        private void textBox_savefolder_DragDrop(object sender, DragEventArgs e)
        {
            string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
            if (files != null && files.Length > 0 && Directory.Exists(files[0]))
            {
                textBox_savefolder.Text = files[0];
            }
        }

        private void button_savefolder_Click(object sender, EventArgs e)
        {
            using (FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog())
            {
                folderBrowserDialog.Description = "保存用のフォルダを選択してください。";
                DialogResult result = folderBrowserDialog.ShowDialog();

                if (result == DialogResult.OK && !string.IsNullOrWhiteSpace(folderBrowserDialog.SelectedPath))
                {
                    textBox_savefolder.Text = folderBrowserDialog.SelectedPath;
                }
            }
        }

        private void button_run_Click(object sender, EventArgs e)
        {
            // 出力用フォルダと保存用フォルダのパスを取得
            string outputFolderPath = textBox_outputfolder.Text;
            string saveFolderPath = textBox_savefolder.Text;

            // フォルダが存在するかどうかを確認
            if (!string.IsNullOrWhiteSpace(outputFolderPath) && Directory.Exists(outputFolderPath) &&
                !string.IsNullOrWhiteSpace(saveFolderPath) && Directory.Exists(saveFolderPath))
            {
                try
                {
                    // フォルダ内のすべてのファイルを取得(サブフォルダを含む)
                    string[] files = Directory.GetFiles(outputFolderPath, "*", SearchOption.AllDirectories);

                    int deletedCount = 0;
                    foreach (string file in files)
                    {
                        string fileName = Path.GetFileName(file);
                        string extension = Path.GetExtension(file).ToLower();
                        string destPath = "";

                        if (extension != ".xlsx" && extension != ".csv")
                        {
                            // 拡張子が .xlsx または .csv 以外の場合、ファイルを削除
                            File.Delete(file);
                            deletedCount++;
                        }
                        else
                        {
                            // 拡張子が .csv または .xlsx の場合、適切なフォルダに移動
                            if (extension == ".csv")
                            {
                                destPath = Path.Combine(saveFolderPath, "csv", fileName);
                            }
                            else if (extension == ".xlsx")
                            {
                                destPath = Path.Combine(saveFolderPath, "xlsx", fileName);
                            }
                            else
                            {
                                destPath = Path.Combine(saveFolderPath, "その他", fileName);
                            }

                            if (!File.Exists(destPath))
                            {
                                File.Move(file, destPath);
                            }
                        }
                    }

                }
                catch (Exception ex)
                {
                    // エラー発生時の処理
                    MessageBox.Show("エラーが発生しました: " + ex.Message);
                }
            }
            else
            {
                MessageBox.Show("出力用フォルダまたは保存用フォルダが指定されていないか、存在しません。");
            }

            // 出力用フォルダを空にする
            try
            {
                DirectoryInfo di = new DirectoryInfo(outputFolderPath);
                foreach (FileInfo file in di.GetFiles())
                {
                    file.Delete();
                }
                foreach (DirectoryInfo dir in di.GetDirectories())
                {
                    dir.Delete(true); // true でサブフォルダとその内容も削除
                }

                MessageBox.Show("出力用フォルダが空になりました。");
            }
            catch (Exception ex)
            {
                MessageBox.Show("出力用フォルダのクリア中にエラーが発生しました: " + ex.Message);
            }
        }

    }
}

こんな感じです。

テキストボックスはフォルダをドラックドロップで入れれる仕様ですが、ドラックドロップ操作を有効にするために、テキストボックスの”AllowDrop”プロパティを’true’に設定しててください。

何かの参考になれば、幸いです。

ここまで読んでいただきありがとうございました。

スクールの紹介

最後に宣伝をさせてください。

夢見るAIエンジニアへ、今こそ一歩を踏み出せ!

最近、AI技術やデータサイエンスに興味を持ち始めたあなた。将来、AIエンジニアやデータサイエンティストとして活躍したいと考えているかもしれません。また、AIを使って業務課題や研究課題を解決したい、あるいは教養としてAIの知識を深めたいと思っている方もいるでしょう。

しかし、学び始めるとなると「どこから手をつけて良いのか分からない」「専門的すぎて理解できない」といった悩みが生じることも。そんなあなたのために、この3ヶ月間集中してAIプログラミングを習得するオンラインコーチングサービスがオススメです!

なぜこのサービスが選ばれるのか?その理由はこちら

  1. 初心者から上級者まで
    完全なプログラミング初心者から研究者まで、幅広い方々に優良なコンテンツが提供されます。
  2. 徹底的な進捗管理
    受講者の進捗をしっかりとチェックし、つまずきやすいポイントでのフォローが万全です。
  3. 専属メンターによる徹底サポート
    AIの学び方から、実際の適用まで、専属のメンターが手厚くサポートします。
  4. 場所を選ばず学べるオンライン完結
    東京以外の地域からも、気軽に学び始めることができます。

信頼の実績多数!
・日本最大級のプログラミングスクール実績
・受講者総数700名以上
・SaaS型学習サービス会員65,000名以上
・企業導入実績120社以上
・グッドデザイン賞受賞
・著名な賞受賞歴や経団連加盟も実現

夢を叶えるための第一歩を、一緒に踏み出しませんか?今なら、あなたもその一員として学び始めることができます!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次