今回は実際にファイルやフォルダにコメントを残せるようにします。このままでは劣化版エクスプローラーなので・・・。
まずファイルパスとコメントをセットで記憶させるためのクラスを作成します。
1 2 3 4 5 |
public class FileTag { public string FilePath = ""; public string Text = ""; } |
1 2 3 4 |
public partial class Form1 : Form { List<FileTag> FileTags = new List<FileTag>(); } |
次にリストビューにおいてファイルやフォルダが選択されているときにリッチテキストボックスになにか文章を書くとそれを記録することができるようにします。
選択されているファイル・フォルダのパスが変更されるタイミングでこれまで選択されていたパスに対するコメントを残すのです。そこで新しいファイルまたはフォルダが選択されるときにこれまで選択されていたもののパスをフィールド変数に記憶させます。
あとは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 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
public partial class Form1 : Form { string _selectedPath = ""; string _oldSelectedPath = ""; string SelectedPath { get { return _selectedPath; } set { // これまで選択されていたパスのコメントを記憶する SaveOldData(); // 選択されたパスのコメントを表示させる LoadNewData(value); } } void SaveOldData() { // これまで選択されていたパスは有効なものか? // そうであるなら現在表示されているコメントを記憶する if(Directory.Exists(_oldSelectedPath) || File.Exists(_oldSelectedPath)) { // 既存のコメントはあるか? FileTag tag = FileTags.FirstOrDefault(x => x.FilePath == _oldSelectedPath); if(tag != null) tag.Text = richTextBox1.Text; else if(richTextBox1.Text != "") { // 既存のコメントがなく新しいコメントが存在する場合だけ保存する FileTag newTag = new FileTag(); newTag.FilePath = _oldSelectedPath; newTag.Text = richTextBox1.Text; FileTags.Add(newTag); } } } void LoadNewData(string value) { // 新しくセットされた文字列はファイルまたはフォルダのパスなのか? // そうであるならそのパスに対応するコメントは存在するのか? // 存在するのであればそれを表示する。ないのであればなにも表示させない。 // 新しくセットされた文字列はファイルまたはフォルダのパスではない場合もなにもしない。 if(Directory.Exists(value) || File.Exists(value)) { _selectedPath = value; textBoxSelectedPath.Text = value; // ファイル名取得もこれでOK DirectoryInfo info1 = new DirectoryInfo(value); textBoxSelectedName.Text = info1.Name; FileTag tag = FileTags.FirstOrDefault(x => x.FilePath == _selectedPath); if(tag != null) richTextBox1.Text = tag.Text; else richTextBox1.Text = ""; } else { _selectedPath = ""; textBoxSelectedPath.Text = ""; textBoxSelectedName.Text = ""; richTextBox1.Text = ""; } // 現在のパスをセットしておく _oldSelectedPath = value; } } |
次にデータをファイルとして保存します。
1 2 3 4 |
public class Doc { public List<FileTag> FileTags = null; } |
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 |
using System.IO; using System.Xml.Serialization; public partial class Form1 : Form { private void MenuItemSaveFile_Click(object sender, EventArgs e) { SaveFile(); } void SaveFile() { SaveOldData(); Doc doc = new Doc(); doc.FileTags = FileTags; SaveFileDialog dialog = new SaveFileDialog(); dialog.Filter = "データファイル(*.xml)|*.xml"; dialog.DefaultExt = "xml"; if(dialog.ShowDialog() == DialogResult.OK) { XmlSerializer xml = new XmlSerializer(typeof(Doc)); StreamWriter sw = new StreamWriter(dialog.FileName); xml.Serialize(sw, doc); sw.Close(); } dialog.Dispose(); } private void MenuItemOpenFile_Click(object sender, EventArgs e) { OpenFile(); } void OpenFile() { OpenFileDialog dialog = new OpenFileDialog(); dialog.Filter = "データファイル(*.xml)|*.xml"; dialog.DefaultExt = "xml"; if(dialog.ShowDialog() == DialogResult.OK) { XmlSerializer xml = new XmlSerializer(typeof(Doc)); StreamReader sr = new StreamReader(dialog.FileName); Doc doc = (Doc)xml.Deserialize(sr); sr.Close(); FileTags = doc.FileTags; } dialog.Dispose(); } } |
また選択されているフォルダをエクスプローラーで開いたり、ファイルを開くことができるようにしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public partial class Form1 : Form { private void MenuItemRun_Click(object sender, EventArgs e) { try { System.Diagnostics.Process.Start(SelectedPath); } catch { MessageBox.Show("開くことができません!", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } |