專案需求:監控特定資料夾檔案變更、開機自動啟動、變更即時通知使用者。研究發現 .NET 內建 FileSystemWatcher 元件完美契合,且無需拖曳控制項至設計面,完全以代碼實例化即可。
public static FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.Deleted += new FileSystemEventHandler(OnChanged);
watcher.Renamed += new RenamedEventHandler(OnRenamed);
private void OnChanged(object sender, FileSystemEventArgs e)
{
// e.ChangeType: Changed/Created/Deleted
// e.FullPath: 完整路徑
// e.Name: 檔名
LogChange($"檔案 {e.ChangeType}: {e.FullPath}");
NotifyUser($"偵測到檔案 {e.ChangeType}: {e.Name}");
}
private void OnRenamed(object sender, RenamedEventArgs e)
{
LogChange($"檔案重命名: {e.OldFullPath} -> {e.FullPath}");
NotifyUser($"檔案重命名: {e.OldName} -> {e.Name}");
}
資料夾監控涉及系統安全,需宣告權限避免被視為非法操作:
[PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]
private void AutoRun_CheckedChanged(object sender, EventArgs e)
{
string appName = "資料夾監控.exe";
string appPath = Application.ExecutablePath;
RegistryKey runKey = Registry.LocalMachine.OpenSubKey(
@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);
if (AutoRun.Checked) // 啟用開機自啟
{
try
{
runKey.SetValue(appName, appPath);
runKey.Close();
}
catch (IOException) { return; }
}
else // 關閉開機自啟
{
string[] names = runKey.GetValueNames();
foreach (string name in names)
{
if (name.Equals(appName))
{
runKey.DeleteValue(appName);
runKey.Close();
break;
}
}
}
}



紅框處為運行中的監控程式,支援類似 QQ 的彈出通知提醒。
| 技術點 | 實作要點 |
|---|---|
| FileSystemWatcher | 代碼實例化,非設計面拖曳;設定 Path、Filter、NotifyFilter、EnableRaisingEvents |
| 事件處理 | Changed/Created/Deleted 共用處理器;Renamed 獨立處理 |
| 權限宣告 | |
| 開機自啟 | HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 登錄表讀寫 |
| 系統匣駐留 | NotifyIcon 控制項,ContextMenuStrip 提供還原/退出選單 |
| 通知提醒 | NotifyIcon.ShowBalloonTip 或自訂視窗 |
Filter = "*.txt|*.doc|*.pdf" 降低事件噪音InternalBufferSize 調大防止事件丟失(預設 8KB)原文連結:https://www.cnblogs.com/wukaibo/archive/2011/04/05/2006179.html