C#實(shí)現(xiàn)實(shí)時(shí)監(jiān)控文件夾變化
在開發(fā)各種應(yīng)用程序時(shí),我們經(jīng)常需要對(duì)文件系統(tǒng)中的文件或文件夾進(jìn)行實(shí)時(shí)監(jiān)測(cè),以便在文件內(nèi)容改變、文件被創(chuàng)建或刪除時(shí)能夠及時(shí)做出反應(yīng)。在 C# 中,System.IO.FileSystemWatcher 類為我們提供了這樣一個(gè)強(qiáng)大的功能。
一、引入 FileSystemWatcher 類
首先,在項(xiàng)目中引入 System.IO 命名空間,這是使用 FileSystemWatcher 類的前提:
using System.IO;
二、創(chuàng)建并配置 FileSystemWatcher 實(shí)例
下面是一個(gè)簡(jiǎn)單的例子,展示了如何創(chuàng)建一個(gè) FileSystemWatcher 實(shí)例并設(shè)置其監(jiān)視的目錄、事件類型以及事件處理函數(shù):
public class FileFolderMonitor { private FileSystemWatcher _fileWatcher; public void StartMonitoring(string directoryPath) { // 創(chuàng)建 FileSystemWatcher 實(shí)例 _fileWatcher = new FileSystemWatcher(); // 設(shè)置要監(jiān)視的目錄路徑 _fileWatcher.Path = directoryPath; // 設(shè)置要監(jiān)視的更改類型(例如:修改、創(chuàng)建、刪除) _fileWatcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName; // 添加事件處理程序 _fileWatcher.Changed += OnChanged; _fileWatcher.Created += OnChanged; _fileWatcher.Deleted += OnChanged; _fileWatcher.Renamed += OnRenamed; // 開啟事件監(jiān)聽 _fileWatcher.EnableRaisingEvents = true; Console.WriteLine($"已開始監(jiān)視文件夾: {directoryPath}"); } private void OnChanged(object source, FileSystemEventArgs e) { Console.WriteLine($"文件或文件夾發(fā)生變更: {e.FullPath},事件類型: {e.ChangeType}"); } private void OnRenamed(object source, RenamedEventArgs e) { Console.WriteLine($"文件或文件夾被重命名: 舊路徑 {e.OldFullPath} -> 新路徑 {e.FullPath}"); } public void StopMonitoring() { if (_fileWatcher != null) { // 停止引發(fā)事件 _fileWatcher.EnableRaisingEvents = false; // 清理資源 _fileWatcher.Dispose(); _fileWatcher = null; Console.WriteLine("已停止監(jiān)視文件夾"); } } }
三、使用與注意事項(xiàng)
在上述代碼中,我們通過調(diào)用 StartMonitoring 方法啟動(dòng)了對(duì)指定目錄的監(jiān)視,并且在文件或子目錄發(fā)生變化時(shí)觸發(fā)相應(yīng)的事件處理器。
NotifyFilter 屬性用來定義需要監(jiān)聽的具體事件類型,如最后寫入時(shí)間、文件名和目錄名的變化等。
Changed、Created、Deleted 和 Renamed 四個(gè)事件分別對(duì)應(yīng)于文件或文件夾的內(nèi)容更改、新建、刪除和重命名操作。
注意事項(xiàng):
FileSystemWatcher 類并不能保證事件的即時(shí)性或順序性,尤其是在大量并發(fā)文件操作的情況下,可能會(huì)合并或延遲觸發(fā)事件。
使用 FileSystemWatcher 時(shí)應(yīng)確保合理處理資源,特別是當(dāng)不再需要監(jiān)視時(shí),應(yīng)及時(shí)調(diào)用 Dispose 方法釋放資源。
總結(jié)來說,System.IO.FileSystemWatcher 是實(shí)現(xiàn)文件系統(tǒng)實(shí)時(shí)監(jiān)控的強(qiáng)大工具,只需簡(jiǎn)單配置和事件處理,就能讓我們的應(yīng)用程序具備靈敏響應(yīng)文件系統(tǒng)變化的能力。
四、課外探索,彈出文件選擇框
public static string SelectFolder(string description = "請(qǐng)選擇一個(gè)文件夾:", Environment.SpecialFolder rootFolder = Environment.SpecialFolder.MyComputer) { using (FolderBrowserDialog folderDialog = new FolderBrowserDialog()) { folderDialog.Description = description; folderDialog.RootFolder = rootFolder; if (folderDialog.ShowDialog() == DialogResult.OK) { return folderDialog.SelectedPath; } } return string.Empty; }
五、調(diào)用示例
參數(shù)調(diào)用:
string selectedFolder = SelectFolder("請(qǐng)選擇一個(gè)保存位置:", Environment.SpecialFolder.Desktop);
或者使用默認(rèn)參數(shù),直接選擇"我的電腦"作為根目錄
string myComputerSelectedFolder = SelectFolder();
合并調(diào)用方法要加空過濾避免報(bào)錯(cuò)
string selectedFolderPath = SelectFolder(); if (!string.IsNullOrEmpty(selectedFolderPath)) { StartMonitoring(selectedFolderPath); }
到此這篇關(guān)于C#實(shí)現(xiàn)實(shí)時(shí)監(jiān)控文件夾變化的文章就介紹到這了,更多相關(guān)C#監(jiān)控文件夾內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于C#的圖表控件庫(kù) ScottPlot編譯visual studio 2022
基于 C# 的 圖表控件庫(kù) ScottPlot,開源免費(fèi),可以用于開發(fā)一些上位機(jī)軟件,如電壓、電流波形的顯示,開發(fā)【示波器】圖形界面,可以顯示一些圖表、波形,總之功能比較的強(qiáng)大,本文介紹了基于C#的圖表控件庫(kù) ScottPlot編譯visual studio 2022,需要的朋友可以參考下2022-06-06C#彈出對(duì)話框確定或者取消執(zhí)行相應(yīng)操作的實(shí)例代碼
這篇文章主要介紹了C#彈出對(duì)話框確定或者取消執(zhí)行相應(yīng)操作的實(shí)例代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12C#實(shí)現(xiàn)Ruby的負(fù)數(shù)索引器
這篇文章主要介紹了C#實(shí)現(xiàn)Ruby的負(fù)數(shù)索引器的相關(guān)代碼和使用方法,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2016-07-07基于C#調(diào)用c++Dll結(jié)構(gòu)體數(shù)組指針的問題詳解
下面小編就為大家分享一篇基于C#調(diào)用c++Dll結(jié)構(gòu)體數(shù)組指針的問題詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2017-12-12