| 類別 | 用途 |
|---|---|
| File | 建立、複製、移動、刪除、讀寫屬性、開啟文字/二進位流 |
| Directory | 建立、刪除、列舉、移動目錄 |
| FileStream | 隨機存取檔案位元組流 |
| StreamReader/Writer | 文字編碼讀寫 (預設 UTF-8) |
// View 模式
listView1.View = View.LargeIcon; // 大圖示
listView1.View = View.SmallIcon; // 小圖示
listView1.View = View.List; // 清單
listView1.View = View.Details; // 詳細資料 (多欄)
listView1.View = View.Tile; // 標題 (Vista+)
// 圖示來源
listView1.LargeImageList = imageListLarge; // 32x32 或更大
listView1.SmallImageList = imageListSmall; // 16x16
// 多選
listView1.MultiSelect = true;
var selected = listView1.SelectedItems; // 取得選取項目集合
設計時透過屬性視窗匯入圖片;執行時用 imageList.Images.Add(icon) 動態添加。綁定給 ListView、TreeView、ToolBar、TabControl 等。
// 1. 設計器拖入 ContextMenuStrip1
// 2. 目標控制項 ContextMenuStrip 屬性指向它
// 3. 動態加入項目
contextMenuStrip1.Items.AddRange(new ToolStripItem[]
{
mnuNewFile, mnuSeparator1, mnuCut, mnuCopy, mnuPaste, mnuDelete
});
public static class Folder
{
public static void New(string name, string path)
{
name = name.Trim();
if (string.IsNullOrEmpty(name)) { MessageBox.Show("目錄名不可空"); return; }
string full = Path.Combine(path, name);
if (Directory.Exists(full)) { MessageBox.Show("已存在,請重新命名"); return; }
Directory.CreateDirectory(full);
}
public static void Copy(string srcDir, string fileName, string destDir)
=> File.Copy(Path.Combine(srcDir, fileName), Path.Combine(destDir, fileName));
public static void Delete(string fullPath, bool recursive)
=> Directory.Delete(fullPath, recursive);
public static DirectoryInfo GetInfo(string path) => new DirectoryInfo(path);
// 取得路徑中最後一層目錄名起始索引
internal static int GetLastDirIndex(string fullPath)
{
for (int i = fullPath.Length - 1; i >= 0; i--)
if (fullPath[i] == '\\') return i + 1;
return 0;
}
}
public static class Txt
{
public static void New(string name, string path)
{
name = name.Trim();
if (string.IsNullOrEmpty(name)) { MessageBox.Show("檔名不可空"); return; }
string full = Path.Combine(path, name + ".txt");
if (File.Exists(full)) { MessageBox.Show("已存在"); return; }
using (File.CreateText(full)) { } // 建立空檔
}
public static string Read(string fullPath)
{
try
{
using var fs = new FileStream(fullPath, FileMode.Open, FileAccess.Read);
using var sr = new StreamReader(fs);
return sr.ReadToEnd();
}
catch (Exception ex) { MessageBox.Show(ex.Message); return ""; }
}
public static void Save(string fullPath, string content)
{
try { File.WriteAllText(fullPath, content); }
catch (Exception ex) { MessageBox.Show(ex.Message); }
}
public static void SaveAs(SaveFileDialog dlg, string content)
{
if (dlg.ShowDialog() == DialogResult.OK)
{
try { File.WriteAllText(dlg.FileName, content); }
catch (Exception ex) { MessageBox.Show(ex.Message); }
}
}
// RichTextBox 格式切換:利用 Font.Style 位運算
public static void ToggleBold(RichTextBox rtb)
{
var f = rtb.SelectionFont;
var style = f.Bold ? f.Style & ~FontStyle.Bold : f.Style | FontStyle.Bold;
rtb.SelectionFont = new Font(f, style);
}
public static void ToggleItalic(RichTextBox rtb)
{
var f = rtb.SelectionFont;
var style = f.Italic ? f.Style & ~FontStyle.Italic : f.Style | FontStyle.Italic;
rtb.SelectionFont = new Font(f, style);
}
public static void ToggleUnderline(RichTextBox rtb)
{
var f = rtb.SelectionFont;
var style = f.Underline ? f.Style & ~FontStyle.Underline : f.Style | FontStyle.Underline;
rtb.SelectionFont = new Font(f, style);
}
public static void Copy(RichTextBox rtb)
{
if (!string.IsNullOrEmpty(rtb.SelectedText))
Clipboard.SetDataObject(rtb.SelectedText, true);
}
public static void Cut(RichTextBox rtb)
{
if (rtb.SelectedText.Length > 0)
try { rtb.Cut(); } catch (Exception ex) { MessageBox.Show(ex.Message); }
}
public static void Paste(RichTextBox rtb) => rtb.Paste();
}





將檔案/資料夾操作封裝為靜態工具類別,符合單一職責原則;UI 層僅負責呼叫與呈現,便於單元測試與未來遷移至 Web (ASP.NET Core + 前端框架) 架構。