C#-使用FileSystemWatcher控件實(shí)現(xiàn)的文件監(jiān)控功能

一糠聪、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);

? ? ? ? }

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末昔榴,一起剝皮案震驚了整個(gè)濱河市辛藻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌论泛,老刑警劉巖揩尸,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異屁奏,居然都是意外死亡岩榆,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)坟瓢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)勇边,“玉大人,你說(shuō)我怎么就攤上這事折联×0” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵诚镰,是天一觀的道長(zhǎng)奕坟。 經(jīng)常有香客問(wèn)我,道長(zhǎng)清笨,這世上最難降的妖魔是什么月杉? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮抠艾,結(jié)果婚禮上苛萎,老公的妹妹穿的比我還像新娘。我一直安慰自己检号,他們只是感情好腌歉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著齐苛,像睡著了一般翘盖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凹蜂,一...
    開(kāi)封第一講書(shū)人閱讀 50,050評(píng)論 1 291
  • 那天最仑,我揣著相機(jī)與錄音藐俺,去河邊找鬼。 笑死泥彤,一個(gè)胖子當(dāng)著我的面吹牛欲芹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吟吝,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼菱父,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了剑逃?” 一聲冷哼從身側(cè)響起浙宜,我...
    開(kāi)封第一講書(shū)人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蛹磺,沒(méi)想到半個(gè)月后粟瞬,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡萤捆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年裙品,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俗或。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡市怎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出辛慰,到底是詐尸還是另有隱情区匠,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布帅腌,位于F島的核電站驰弄,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏速客。R本人自食惡果不足惜揩懒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望挽封。 院中可真熱鬧,春花似錦臣镣、人聲如沸辅愿。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)点待。三九已至,卻和暖如春弃舒,著一層夾襖步出監(jiān)牢的瞬間癞埠,已是汗流浹背状原。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留苗踪,地道東北人颠区。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像通铲,于是被迫代替她去往敵國(guó)和親毕莱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容