せいり君
家で使用するファイル整理用のツールを適当に作ったのでソースコードをメモっておきます。
何をするツールかというと。
1.指定のディレクトリ内にあるディレクトリ名を取得
2.取得したディレクトリ名が含まれる指定ディレクトリ直下のファイルを取得
3.指定された日にち以前の2.で取得したファイルを1.で取得したディレクトリに移動
以上をするだけのツールです。
ちょっと前に作ったので説明するのがめんどくさい。
そして、適当すぎてやばい。。。
とりあえずコードはこんな風になりました。
いらないのもあるかもしれない参照先宣言
using System; using System.Collections.Generic; using System.Windows.Forms; using System.Collections; using System.IO;
private IDictionary<String, String> _filesDic = new Dictionary<String, String>();
private IDictionary<String, String> _foldersDic = new Dictionary<String, String>();
private String _files = null;
private String _folders = null;
private IDictionary<String, String> _move = new Dictionary<String, String>();
フォームのイベント
/// <summary> /// directoryPathTextBoxをクリックしたイベント /// </summary> private void directoryPathTextBox_DoubleClick(object sender, EventArgs e) { if (folderSelect.ShowDialog(this) == DialogResult.OK) { directoryPathTextBox.Text = folderSelect.SelectedPath; moveButton.Enabled = true; } } /// <summary> /// moveButtonをクリックしたイベント /// </summary> private void moveButton_Click(object sender, EventArgs e) { progressBar.Value = 0; DateTime cutDate = new DateTime( dateTimePicker1.Value.Year, dateTimePicker1.Value.Month, dateTimePicker1.Value.Day); InDictionary(cutDate); IDictionary<String, String> fileToDire = SearchFiles( (Int32)numericUpDown1.Value); progressBar.Maximum = fileToDire.Count; if (ShowMoveMessage(fileToDire) == DialogResult.OK) { label2.Text = "0 / " + fileToDire.Count.ToString(); MoveFilesToDirectory(fileToDire); } }
グローバル変数に入れてくところ
private void InDictionary(DateTime cutDate) { String directoryPath = directoryPathTextBox.Text; String filePaths = System.IO.Directory.GetFiles(directoryPath, "*", System.IO.SearchOption.TopDirectoryOnly); filePaths = DateCut(filePaths, cutDate); String folderPaths = System.IO.Directory.GetDirectories(directoryPath, "*", System.IO.SearchOption.TopDirectoryOnly); _files = null; _files = GetName(directoryPath, filePaths); _folders = null; _folders = GetName(directoryPath, folderPaths); _filesDic.Clear(); _filesDic = GetDictionary(_files, filePaths); _foldersDic.Clear(); _foldersDic = GetDictionary(_folders, folderPaths); } private String DateCut(String paths, DateTime cutDate) { ArrayList resPaths = new ArrayList(); for (Int32 i = 0; i < paths.Length; i++) { DateTime dtCreate = File.GetCreationTime(paths[i]); if (cutDate.CompareTo(dtCreate) > 0) { resPaths.Add(paths[i]); } } try { return (String)resPaths.ToArray(typeof(String)); } catch { } return new String[0]; } private String GetName(String localPath, String paths) { Int32 itemsCount = paths.Length; String resStrs = new String[itemsCount]; for (Int32 i = 0; i < itemsCount; i++) { resStrs[i] = paths[i].Split(new String { localPath }, StringSplitOptions.RemoveEmptyEntries)[0]; resStrs[i] = resStrs[i].Split(new String { "\\" }, StringSplitOptions.RemoveEmptyEntries)[0]; } return resStrs; } private IDictionary<String, String> GetDictionary( String Keys, String Values) { if (Keys.Length != Values.Length) return null; Int32 dicLen = Keys.Length; IDictionary<String, String> resDic = new Dictionary<String, String>(); for (Int32 i = 0; i < dicLen; i++) { resDic.Add(Keys[i], Values[i]); } return resDic; }
合致するファイルを検索
private IDictionary<String, String> SearchFiles(Int32 length) { IDictionary<String, String> fileToDirectory = new Dictionary<String, String>(); for (Int32 i = 0; i < _folders.Length; i++) { for (Int32 j = 0; j < _files.Length; j++) { if (_folders[i].Length > length && _files[j].Contains(_folders[i])) { if (!fileToDirectory.ContainsKey(_files[j])) { fileToDirectory.Add(_files[j], _folders[i]); } else { //ここで、どっちのディレクトリに移動させるか選択できるようにする DialogResult result = MessageBox.Show("[ " + _files[j] + " ] のコピー先を\r\n" + "(N)[ " + fileToDirectory[_files[j]] + " ]\r\n" + "から\r\n" + "(Y)[ " + _folders[i] + " ]\r\n" + "に変更しますか?", "コピー先の選択", MessageBoxButtons.YesNo, MessageBoxIcon.Information); if (result == DialogResult.Yes) { fileToDirectory.Remove(_files[j]); fileToDirectory.Add(_files[j], _folders[i]); } } } } } return fileToDirectory; }
ファイルの移動
private Boolean MoveFilesToDirectory(IDictionary<String, String> fileToDirectory) { Boolean returnBool = true; for (Int32 i = 0; i < _files.Length; i++) { if (fileToDirectory.ContainsKey(_files[i])) { String directory = fileToDirectory[_files[i]]; String moveFile = _foldersDic[directory] + "\\" + _files[i]; statusLabel.Text = _files[i] + " -> " + moveFile; statusStrip1.Refresh(); try { File.Move(_filesDic[_files[i]], moveFile); } catch(Exception) { returnBool = false; } progressBar.Value++; progressBar.Refresh(); label2.Text = progressBar.Value.ToString() + " / " + fileToDirectory.Count.ToString(); label2.Refresh(); } } statusLabel.Text = "終了"; return returnBool; }
コピーファイルを確認するウィンドウの表示
private DialogResult ShowMoveMessage(IDictionary<String, String> fileToDirectory) { _move.Clear(); String message = "コピーファイル " + fileToDirectory.Count.ToString() + "件"; for (Int32 i = 0; i < _files.Length; i++) { if (fileToDirectory.ContainsKey(_files[i])) { String directory = fileToDirectory[_files[i]]; String moveFile = _foldersDic[directory]; _move.Add(_files[i], moveFile); } } MoveFileView view = new MoveFileView(_move, _files); return view.ShowDialog(); } } }
コピーするファイルを確認するウィンドウ
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace FileInDirectory
{
public partial class MoveFileView : Form
{
IDictionary<String, String> _fileToDire = new Dictionary<String, String>();
String _files = null;
public MoveFileView(IDictionary<String, String> fileToDire, String files)
{
InitializeComponent();
_fileToDire = fileToDire;
_files = files;
}
private void MoveFileView_Load(object sender, EventArgs e)
{
for (Int32 i = 0; i < _files.Length; i++)
{
if (_fileToDire.ContainsKey(_files[i]))
{
dataGridView1.Rows.Add(new String[2]{_files[i], _fileToDire[_files[i]]});
}
}
}
private void OKButton_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.OK;
this.Close();
}
private void CancelButton_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.Cancel;
this.Close();
}
}
}