最初Pythonでやろうとしたんだけど、いきなりPythonで開発するのは敷居が高いと思われたため、開発が楽なC#(WinForm)でたたき台を作ってみる事にした。
特にGUIはCodingしなければならないため、Visual Studioみたいに直感的にマウスで並べるという訳にはいかない。
参考にしたソフトウェア
とりあえず似たような機能を適当に実装してみる。
実行結果画像
前提条件として、
C:¥test フォルダを作成しておき、そこにテスト用ファイルをコピーしておいた。
プロジェクトファイル
ソースコード全文
面倒なので一応注釈はつけるが、個別には分けない事にしている。 ちなみにエクスプローラー風のUIはBlogページのソースコードを流用している。一応感謝の意を。
独自の実装は実行ボタンを押したときの挙動ぐらいである。
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化したくないなあという感触。