自分のブログ名

sheephumanのブログ

ひつじ好きな人間のブログ。

C#でファイルリネームアプリを開発してみた記録

 

 最初Pythonでやろうとしたんだけど、いきなりPythonで開発するのは敷居が高いと思われたため、開発が楽なC#(WinForm)でたたき台を作ってみる事にした。

 特にGUIはCodingしなければならないため、Visual Studioみたいに直感的にマウスで並べるという訳にはいかない。

 



参考にしたソフトウェア

f:id:sheephuman:20210328133916p:plain

 

 

とりあえず似たような機能を適当に実装してみる。

 

 

f:id:sheephuman:20210329181909p:plain

 

 

実行結果画像

f:id:sheephuman:20210329182245p:plain



f:id:sheephuman:20210329185713p:plain 

 

前提条件として、

C:¥test フォルダを作成しておき、そこにテスト用ファイルをコピーしておいた。

 

 

プロジェクトファイル

drive.google.com

ソースコード全文



面倒なので一応注釈はつけるが、個別には分けない事にしている。 ちなみにエクスプローラー風のUIはBlogページのソースコードを流用している。一応感謝の意を。



www.doraxdora.com

独自の実装は実行ボタンを押したときの挙動ぐらいである。


using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows.Forms;

namespace WinFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            // ドライブ一覧を走査してツリーに追加
            foreach (String drive in Environment.GetLogicalDrives())
            {
                // 新規ノード作成
                // プラスボタンを表示するため空のノードを追加しておく
                TreeNode node = new TreeNode(drive);
                node.Nodes.Add(new TreeNode());
                treeView1.Nodes.Add(node);
            }
            // 初期選択ドライブの内容を表示
            setListItem(Environment.GetLogicalDrives().First());
        }
        DirectoryInfo di;

        private void Form1_Load(object sender, EventArgs e)
        {
            
            // 初期選択ドライブの内容を表示
            setListItem(Environment.GetLogicalDrives().First());
        }

        private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
        {
            TreeNode tn = e.Node, tn2;
            string d = tn.FullPath;//展開するノードのフルパスを取得
            tn.Nodes.Clear();
            di = new DirectoryInfo(d);//ディレクトリ一覧を取得
            try
            {
                foreach (DirectoryInfo d2 in di.GetDirectories())
                {
                    tn2 = new TreeNode(d2.Name, 1, 2);
                    tn.Nodes.Add(tn2);
                    tn2.Nodes.Add("...");
                }
                foreach (FileInfo fi in di.GetFiles())
                {
                    tn2 = new TreeNode(fi.Name, 3, 3);
                    tn.Nodes.Add(tn2);
                }
            }
            catch { }
        }


        /// リストビューの項目を設定します.
        /// </summary>
        private void setListItem(string filePath)
        {
            // リストビューのヘッダーを設定
            listView1.View = View.Details;
            listView1.Clear();
            listView1.Columns.Add("名前");
            //listView1.Columns.Add("更新日時");
            //listView1.Columns.Add("サイズ");

            try
            {
                // フォルダ一覧
                DirectoryInfo dirList = new DirectoryInfo(filePath);
                foreach (DirectoryInfo di in dirList.GetDirectories())
                {
                    ListViewItem item = new ListViewItem(di.Name);
                    item.SubItems.Add(String.Format("{0:yyyy/MM/dd HH:mm:ss}", di.LastAccessTime));
                    item.SubItems.Add("");
                    listView1.Items.Add(item);
                }

                // ファイル一覧
                List<String> files = Directory.GetFiles(filePath).ToList<String>();
                foreach (String file in files)
                {
                    FileInfo info = new FileInfo(file);
                    ListViewItem item = new ListViewItem(info.Name);
                    //item.SubItems.Add(String.Format("{0:yyyy/MM/dd HH:mm:ss}", info.LastAccessTime));
                    //item.SubItems.Add(getFileSize(info.Length));
                    listView1.Items.Add(item);
                }
            }
            catch (IOException ie)
            {
                MessageBox.Show(ie.Message, "選択エラー");
            }

            // 列幅を自動調整
            listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
        }


        /// <summary>
        /// ファイルサイズを単位付きに変換して返します.
        /// </summary>
        /// <param name="fileSize"></param>
        /// <returns></returns>
        private String getFileSize(long fileSize)
        {
            String ret = fileSize + " バイト";
            if (fileSize > (1024f * 1024f * 1024f))
            {
                ret = Math.Round((fileSize / 1024f / 1024f / 1024f), 2).ToString() + " GB";
            }
            else if(fileSize > (1024f * 1024f))
                {
                ret = Math.Round((fileSize / 1024f / 1024f), 2).ToString() + " MB";
            }
            else if(fileSize > 1024f)
                {
                ret = Math.Round((fileSize / 1024f)).ToString() + " KB";
            }

            return ret;
        }


        /// ツリービュー項目選択時(前)のイベントハンドラ.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
          
           
                setListItem(e.Node.FullPath);
            
        }

        private void treeView1_BeforeExpand_1(object sender, TreeViewCancelEventArgs e)
        {
            TreeNode node = e.Node;
            String path = node.FullPath;
            node.Nodes.Clear();

            try
            {
                DirectoryInfo dirList = new DirectoryInfo(path);
                foreach (DirectoryInfo di in dirList.GetDirectories())
                {
                    TreeNode child = new TreeNode(di.Name);
                    child.Nodes.Add(new TreeNode());
                    node.Nodes.Add(child);
                }
            }
            catch (IOException ie)
            {
                MessageBox.Show(ie.Message, "選択エラー");
            }
        }

        private void Excutebutton_Click(object sender, EventArgs e)
        {


   //Nodeのフルパス取得
            string SelectedPath = treeView1.SelectedNode.FullPath;

            //List<string> files = listView1.Items.;

            var files = new List<string>();
            int count = 0;
   

   //Nullチェック
            if (textBox2.Text != "")
            { count = int.Parse(textBox2.Text); }


  //items[0].Subitems では一行分しか取得できないため、For文を回す必要があった
            for (int i = 0; i < listView1.Items.Count; i++)
            {
                foreach (ListViewItem.ListViewSubItem item in listView1.Items[i].SubItems)
                {
      //予め宣言しておいたFilesにAddする。
                    files.Add(SelectedPath + "\\" + item.Text);
                }
            }

            foreach (string file in files)
            {
                count++;
    //Path.GetExtension(file); 拡張子取得
                string Unitestring = Path.GetDirectoryName(file) + "\\" + textBox1.Text + count + Path.GetExtension(file);

                File.Move(file, Unitestring);
    
    //Rename結果を表示する。
                listView3.Items.Add(Unitestring);
            }
        }


    }
}



最低限の実装しかしてないけど、流石にいくらかは簡単だった。特にサンプルコードは助かった。 Pythonでやるとこの3倍ぐらい時間掛かりそうなんですよね・・・・
出来ることなら無理にGUI化したくないなあという感触。