2011-09-09 32 views
5

我正在使用FileSystemWatcher掃描Web應用程序上傳文件的文件夾。我有超過1000個文件被上傳到文件夾。現在,問題是FileSystemWatcher在第一個文件被複制時啓動,有時它不適用於所有文件。任何建議都將非常可觀。FileSystemWatcher無法正常工作

回答

8

FileSystemWatcherdocumentation說(重點煤礦):

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

注意,當超出緩衝區大小 當FileSystemWatcher的可能錯過的事件。爲避免丟失事件,請遵循以下準則:

通過設置InternalBufferSize屬性來增加緩衝區大小。

避免觀看長文件名的文件,因爲長文件名 有助於填充緩衝區。考慮使用較短的名稱重命名這些文件 。

保持您的事件處理代碼儘可能短。

如果你已經嘗試了上面,它仍然不是你不夠可靠,恐怕唯一的解決方法是將訂閱Error事件和手動一旦發生任何枚舉該目錄的內容。

3

爲了詳細說明喬恩的回答是:

還有另一種可能的解決方案,從發生的歷史推遲緩衝區溢出。通過處理您監控的事件,例如Created事件,儘可能快地從緩衝區中刪除與事件相關的信息,以便它可以回收該空間。

爲了加快速度,您可以選擇異步處理文件。只要事件被觸發,您就將隊列的完整路徑排隊到隊列中,然後隊列將由工作線程處理。綁定到Created事件的事件處理程序的責任減少到將字符串(文件路徑)添加到隊列中。

例如:

public class FileProcessor 
{ 
    private readonly Queue<string> files = new Queue<string>(); 

    public void EnqueueFile(string path) 
    { 
     files.Enqueue(path); 
    } 
} 

爲附連到所創建的事件的事件處理程序的代碼然後可以最小化,以這樣的:

static void file_Created(object sender, FileSystemEventArgs e) 
{ 
    _fileProcessor.EnqueueFile(e.FullPath); 
} 

,可以找到有關這種(包括樣本代碼的更多信息)在我兩年前寫的一篇文章中:

http://cgeers.com/2009/08/14/monitoring-a-directory/