一糠聪、FileSystemWatcher簡(jiǎn)介:
? ??監(jiān)控指定文件或目錄的文件的創(chuàng)建、刪除声旺、改動(dòng)笔链、重命名等活動(dòng)“伲可以動(dòng)態(tài)地定義需要監(jiān)控的文件類型及文件屬性改動(dòng)的類型卡乾。
1.常用的幾個(gè)基本屬性:
(1) Path?:設(shè)置要監(jiān)視的目錄的路徑。
(2) IncludeSubdirectories?:設(shè)置是否級(jí)聯(lián)監(jiān)視指定路徑中的子目錄缚够。
(3) Filter?:設(shè)置篩選字符串幔妨,用于確定在目錄中監(jiān)視哪些類型的文件。
(4) NotifyFilter?:設(shè)置文件的哪些屬性的變動(dòng)會(huì)觸發(fā)Changed事件谍椅,同時(shí)監(jiān)控多個(gè)屬性變動(dòng)可以按“或”組合误堡。(默認(rèn)值為 NotifyFilter.LastWrite | NotifyFilter.FileName | NotifyFilter.DirectoryName 組合)
子項(xiàng):?Attributes?????????? --? 文件或文件夾的屬性。
CreationTime?? --? 文件或文件夾的創(chuàng)建時(shí)間雏吭。
DirectoryName?--? 目錄名锁施。(常用)
FileName????????? --? 文件名。?(常用)
LastAccess?????? --? 文件或文件夾上一次打開(kāi)的日期杖们。
LastWrite??????? ?? --? 上一次向文件或文件夾寫(xiě)入內(nèi)容的日期悉抵。
Security????????????? --? 文件或文件夾的安全設(shè)置。
Size??????????????????? --?? 文件或文件夾的大小摘完。 (常用)
(5) EnableRaisingEvents?:設(shè)置是否開(kāi)始監(jiān)控姥饰。(默認(rèn)為false)
2.常用事件:
(1) Changed? :當(dāng)更改文件和目錄時(shí)發(fā)生,可以通過(guò)NotifyFilter屬性設(shè)置觸發(fā)該事件的需要文件更改的屬性孝治。
(2) Created??:? 當(dāng)創(chuàng)建文件和目錄時(shí)發(fā)生列粪。?
(3) Deleted?:??? 刪除文件或目錄時(shí)發(fā)生。?
(4) Renamed? :重命名文件或目錄時(shí)發(fā)生谈飒。
(5) FileSystemEventArgs?對(duì)象:
成員:Name:?????獲取受影響的文件或目錄的名稱岂座。?注意:如果是級(jí)聯(lián)監(jiān)控子目錄的話,該值為從監(jiān)控目錄的下個(gè)目錄到受影響的文件的路徑杭措,而不只是受影響的文件名费什。
????????????FullPath?: 獲取受影響的文件或目錄的完全限定的路徑。?
????????? ? ChangeType?:獲取受影響的文件或目錄的發(fā)生的事件類型瓤介。
子項(xiàng):All???????????????? -- 文件或文件夾的創(chuàng)建吕喘、刪除、更改或重命名刑桑。
Changed???? -- 文件或文件夾的更改氯质。更改的類型包括大小、屬性祠斧、安全設(shè)置闻察、最近寫(xiě)入時(shí)間和最近訪問(wèn)時(shí)間方面的更改。
Created?????? -- 文件或文件夾的創(chuàng)建。
Deleted?????? --? 文件或文件夾的刪除辕漂。
Renamed?? --? 文件或文件夾的重命名呢灶。
(6) RenamedEventArgs?對(duì)象:
成員:Name:???????????獲取受影響的文件或目錄的新名稱。?
????????? ??OldName?: ?? 獲取受影響的文件或目錄的舊名稱钉嘹。
? ? ? ? ? ??FullPath?:????? 獲取受影響的文件或目錄的完全限定的路徑鸯乃。
???????????OldFullPath :?獲取受影響的文件或目錄的前一個(gè)完全限定的路徑。
?????????? ChangeType?:獲取受影響的文件或目錄的發(fā)生的事件類型跋涣。
子項(xiàng):All???????????????? -- 文件或文件夾的創(chuàng)建缨睡、刪除、更改或重命名陈辱。
Changed???? -- 文件或文件夾的更改奖年。更改的類型包括大小、屬性沛贪、安全設(shè)置陋守、最近寫(xiě)入時(shí)間和最近訪問(wèn)時(shí)間方面的更改。
Created?????? -- 文件或文件夾的創(chuàng)建利赋。
Deleted?????? --? 文件或文件夾的刪除水评。
Renamed?? --? 文件或文件夾的重命名。
重點(diǎn):
1.媚送、因?yàn)镕ileSystemWatcher類本身就是多線程的控件之碗,也就是每實(shí)例化一個(gè)FileSystemWatcher自動(dòng)就會(huì)創(chuàng)建一條線程。
2季希、我們需要利用委托進(jìn)行跨線程更新UI界面,因?yàn)橹孛录鬟f的是RenameEventArgs對(duì)象幽纷,而創(chuàng)建式塌、修改、刪除事件傳遞的是FileEventArgs對(duì)象友浸,所以需要聲明兩個(gè)委托峰尝。
3、如果需要同時(shí)監(jiān)控多個(gè)文件(如監(jiān)控系統(tǒng)全盤(pán))收恢,只需要?jiǎng)?chuàng)建FileSystemWatcher數(shù)組武学,每個(gè)文件用一個(gè)FileSystemWatcher進(jìn)行監(jiān)控。
二伦意、代碼演示:
//這是一個(gè)文件監(jiān)控方法火窒,具體執(zhí)行該方法放到你需要調(diào)用的地方,需要傳入路徑和文件類型參數(shù)驮肉,例如:WatcherStrat(@"E:\測(cè)試\", "副本.txt")
public void WatcherStrat(string path, string filter)
? ? ? ? {
????????????//創(chuàng)建一個(gè)FileSystemWatcher的對(duì)象熏矿,并設(shè)置其屬性
? ? ? ? ? ? FileSystemWatcher watcher = new FileSystemWatcher();
????????????//設(shè)置文件路徑
? ? ? ? ? ? watcher.Path = path;?
? ? ? ? ? ? //設(shè)置監(jiān)控文件類型,比如.txt類型
? ? ? ? ? ? watcher.Filter = filter;
? ? ? ? ? ??//當(dāng)由FileSystemWatcher所指定的路徑中的文件或目錄的
? ? ? ? ? ? //大小、系統(tǒng)屬性票编、最后寫(xiě)時(shí)間褪储、最后訪問(wèn)時(shí)間或安全權(quán)限
????????????//發(fā)生更改時(shí),更改事件就會(huì)發(fā)生
? ? ? ? ? ? watcher.Changed += new FileSystemEventHandler(OnProcess);
????????????//由FileSystemWatcher所指定的路徑中文件或目錄被創(chuàng)建時(shí)慧域,創(chuàng)建事件就會(huì)發(fā)生
? ? ? ? ? ? watcher.Created += new FileSystemEventHandler(OnProcess);
????????????//當(dāng)由FileSystemWatcher所指定的路徑中文件或目錄被刪除時(shí)鲤竹,刪除事件就會(huì)發(fā)生
? ? ? ? ? ? watcher.Deleted += new FileSystemEventHandler(OnProcess);
????????????//當(dāng)由FileSystemWatcher所指定的路徑中文件或目錄被重命名時(shí),重命名事件就會(huì)發(fā)生
? ? ? ? ? ? watcher.Renamed += new RenamedEventHandler(OnRenamed);
????????????//開(kāi)始監(jiān)視
? ? ? ? ? ? watcher.EnableRaisingEvents = true;
? ? ? ? ? ? //監(jiān)控子級(jí)目錄
????????????watcher.IncludeSubdirectories = true;
????????????//監(jiān)視LastAcceSS和LastWrite時(shí)間的更改以及文件或目錄的重命名
? ? ? ? ? ? watcher.NotifyFilter = NotifyFilters.Attributes | NotifyFilters.CreationTime | NotifyFilters.DirectoryName | NotifyFilters.FileName | NotifyFilters.LastAccess? ?| NotifyFilters.LastWrite | NotifyFilters.Security | NotifyFilters.Size;
? ? ? ? }
? ? ? ? private void OnProcess(object source, FileSystemEventArgs e)
? ? ? ? {
? ? ? ? ? ? if (e.ChangeType == WatcherChangeTypes.Created)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? OnCreated(source, e);
? ? ? ? ? ? }
? ? ? ? ? ? else if (e.ChangeType == WatcherChangeTypes.Changed)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? OnChanged(source, e);
? ? ? ? ? ? }
? ? ? ? ? ? else if (e.ChangeType == WatcherChangeTypes.Deleted)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? OnDeleted(source, e);
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? //創(chuàng)建文件觸發(fā)事件
? ? ? ? private void OnCreated(object source, FileSystemEventArgs e)
? ? ? ? {
? ??????????//當(dāng)指定文件被創(chuàng)建時(shí)要做的事
? ? ? ? ? ? Console.WriteLine("文件新建事件處理邏輯 {0}? {1}? {2}", e.ChangeType, e.FullPath, e.Name);
? ? ? ? }
? ? ? ? //文件內(nèi)容改變觸發(fā)事件
? ? ? ? private void OnChanged(object source, FileSystemEventArgs e)
? ? ? ? {
? ? ? ? ? ? //當(dāng)指定文件被更改時(shí)要做的事
? ? ? ? ? ? Console.WriteLine("文件改變事件處理邏輯{0}? {1}? {2}", e.ChangeType, e.FullPath, e.Name);
? ? ? ? }
????????//刪除文件觸發(fā)事件
? ? ? ? private void OnDeleted(object source, FileSystemEventArgs e)
? ? ? ? {
? ? ? ? ? ? //指定當(dāng)文件被刪除時(shí)要做的事
? ? ? ? ? ? Console.WriteLine("文件刪除事件處理邏輯{0}? {1}? {2}", e.ChangeType, e.FullPath, e.Name);
? ? ? ? }
????????//重命名文件觸發(fā)事件
? ? ? ? private void OnRenamed(object source, RenamedEventArgs e)
? ? ? ? {
? ? ? ? ? ? //指定當(dāng)文件被更名時(shí)要做的事
? ? ? ? ? ? Console.WriteLine("文件重命名事件處理邏輯{0}? {1}? {2}", e.ChangeType, e.FullPath, e.Name);
? ? ? ? }