では実際にファイルやフォルダにコメントをつけ、これをファイルに保存するところまでやりました。今回はそのコメントをもとに必要なファイル等(「ファイルやフォルダ」というのは面倒なので「ファイル等」と書きます)を探し、その結果を表示させます。
検索用に新しく作成するフォームはこれです。
検索したい単語を入力して[検索]ボタンをおすと、これまで保存されているFileTagのリストから条件をみたすFileTagを返します。そしてそのファイル等の名前をリストビューに表示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
public partial class Form2 : Form { public Form2() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form1 f = (Form1)this.Owner; List<FileTag> fileTags = f.FileTags.Where(x => x.Text.IndexOf(textBox1.Text) != -1).ToList(); listView1.Items.Clear(); foreach(FileTag fileTag in fileTags) { if(Directory.Exists(fileTag.FilePath)) { // フォルダ情報をリストビューに表示 DirectoryInfo info = new DirectoryInfo(fileTag.FilePath); ListViewItem item = new ListViewItem(new string[] { info.Name, "フォルダ", info.CreationTime.ToString(), info.LastWriteTime.ToString(), "", // フォルダなのでサイズはない "" } ); listView1.Items.Add(item); item.Tag = fileTag; } if(File.Exists(fileTag.FilePath)) { // ファイル情報をリストビューに表示 FileInfo info = new FileInfo(fileTag.FilePath); ListViewItem item = new ListViewItem(new string[] { info.Name, "ファイル", info.CreationTime.ToString(), info.LastWriteTime.ToString(), (info.Length/1024 +1).ToString(), "" }); listView1.Items.Add(item); // FileTagオブジェクトをTagプロパティにセット item.Tag = fileTag; } } } } |
リストのアイテムを選択するとそれに対応するファイル等のフルパスがSelectedPathプロパティにセットされます。SelectedPathプロパティにファイル等のフルパスをセットするとテキストボックスにパスとコメントが表示されます。
テキストボックス(実際はリッチテキストボックス)に表示されているコメントを編集すると、新しいコメントとして反映されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
public partial class Form2 : Form { private void listView1_SelectedIndexChanged(object sender, EventArgs e) { var selItems = listView1.SelectedItems; if(selItems.Count == 0) return; FileTag tag = (FileTag)selItems[0].Tag; SelectedPath = tag.FilePath; } string _selectedPath = ""; string _oldSelectedPath = ""; string SelectedPath { get { return _selectedPath; } set { // これまで選択されていたパスのコメントを記憶する SaveOldData(); // 選択されたパスのコメントを表示させる // 現在のパスを_oldSelectedPathにセット(LoadNewData(value)内で行なっている) LoadNewData(value); } } void SaveOldData() { Form1 f = (Form1)this.Owner; // 既存のコメントはあるはず。ないとおかしい。 FileTag tag = f.FileTags.FirstOrDefault(x => x.FilePath == _oldSelectedPath); if(tag != null) tag.Text = richTextBox1.Text; } void LoadNewData(string value) { Form1 f = (Form1)this.Owner; _selectedPath = value; textBoxSelectedPath.Text = value; FileTag tag = f.FileTags.FirstOrDefault(x => x.FilePath == _selectedPath); if(tag != null) richTextBox1.Text = tag.Text; // 現在のパスをセットしておく _oldSelectedPath = value; } } |
リストビューに表示されているアイテムをダブルクリックするとフォルダであればエクスプローラーで開き、ファイルであれば関連付けられているアプリケーションが起動して開かれます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public partial class Form2 : Form { private void listView1_DoubleClick(object sender, EventArgs e) { var sels = listView1.SelectedItems; FileTag tag = (FileTag)sels[0].Tag; if(Directory.Exists(tag.FilePath)) OpenFile(tag.FilePath); if(File.Exists(tag.FilePath)) OpenFile(tag.FilePath); } void OpenFile(string filePath) { try { System.Diagnostics.Process.Start(filePath); } catch { MessageBox.Show("開くことができません!", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } |
検索用のフォームができたらあとは表示させて検索するだけです。メニュー[操作] ⇒ [検索]を選択すれば検索用のフォームが出現します。
1 2 3 4 5 6 7 8 |
public partial class Form1 : Form { private void MenuItemSearch_Click(object sender, EventArgs e) { Form2 f = new Form2(); f.Show(this); } } |