2012-09-18 57 views
4

我有一個FileSystemWatcher,我想觸發一個OnCreated event用於複製到監控目錄每個文件夾。手動將幾個文件夾一次性複製到此目錄中。FileSystemWatcher的OnCreated只燒製的多個文件中第一個文件複製

目前它只爲第一個文件夾複製event
所以,如果我在Windows資源管理器看文件夾X和選擇文件夾A,B,C,並將它們複製到X,OnCreated時,會引發A而非B或C.

這是我的代碼,我通過成立FileSystemWatcher

watcher = new System.IO.FileSystemWatcher(watchPath);    
watcher.InternalBufferSize = 32768; 
watcher.IncludeSubdirectories = true; 
watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.DirectoryName | 
         NotifyFilters.CreationTime | NotifyFilters.LastWrite; 


watcher.Changed += new FileSystemEventHandler(OnChanged); 
watcher.Created += new FileSystemEventHandler(OnCreated); 
watcher.EnableRaisingEvents = true; 

,這裏是我的OnCeated方法

void OnCeated(object sender, FileSystemEventArgs e) 
{    
    XDocument xmlDoc = BeginImport(e.FullPath); 
} 

任何想法這是爲什麼只有觸發事件的第一個文件夾複製到監視目錄中?

回答

10

the documentation

Windows操作系統在通知由FileSystemWatcher的創建一個緩衝的文件更改的組件。 如果在短時間內發生很多變化,緩衝區可能會溢出。這會導致組件無法跟蹤目錄中的更改,並且它只會提供一攬子通知。使用InternalBufferSize屬性增加緩衝區的大小非常昂貴,因爲它來自無法換出到磁盤的非分頁內存,所以請將緩衝區保持爲小但足夠大以便不會錯過任何文件更改事件。 爲避免緩衝區溢出,請使用NotifyFilter和IncludeSubdirectories屬性,以便過濾出不需要的更改通知。

這似乎是一個內部限制。

我認爲一次粘貼所有三個文件夾的行爲被認爲是「短時間內發生許多變化」 - 您可以使用NotifyFilter並省略一些事件嗎?

+1

+1 @ELG可能跟蹤上次處理文件的日期,然後處理任何帶有日期gt的文件。 – Paparazzi

+0

就是這樣,謝謝!我將緩衝區設置爲允許的最大值(64k),關閉包含子目錄,並且僅對CreationTime和DirectoryName進行過濾,並且一次處理至少50個目錄。 – ELG

+0

創建自己的緩衝區也很有幫助;有通知時添加的併發隊列,然後在該隊列上運行。只要基於文件更改所做的工作比將代表對象添加到隊列中的工作(通常是這種情況)所花費的時間更長,這會使丟失的文件更改的可能性降低。 –

相關問題