我正在使用FileSystemWatcher掃描Web應用程序上傳文件的文件夾。我有超過1000個文件被上傳到文件夾。現在,問題是FileSystemWatcher在第一個文件被複制時啓動,有時它不適用於所有文件。任何建議都將非常可觀。FileSystemWatcher無法正常工作
回答
的FileSystemWatcher
documentation說(重點煤礦):
Windows操作系統會通知你的文件的組成部分由FileSystemWatcher的創造了一個緩衝改變 。 如果在短時間內有很多 更改,緩衝區可能會溢出。這會導致 組件丟失跟蹤目錄中的更改,並且僅 會提供一攬子通知。使用 來增加緩衝區的大小InternalBufferSize屬性是昂貴的,因爲它來自 非分頁內存不能換出到磁盤,所以請保持 緩衝區儘可能小但足夠大以便不會錯過任何文件更改事件。 爲避免緩衝區溢出,請使用NotifyFilter和IncludeSubdirectories屬性,以便過濾掉不需要的更改 通知。
。
注意,當超出緩衝區大小 當FileSystemWatcher的可能錯過的事件。爲避免丟失事件,請遵循以下準則:
通過設置InternalBufferSize屬性來增加緩衝區大小。
避免觀看長文件名的文件,因爲長文件名 有助於填充緩衝區。考慮使用較短的名稱重命名這些文件 。
保持您的事件處理代碼儘可能短。
如果你已經嘗試了上面,它仍然不是你不夠可靠,恐怕唯一的解決方法是將訂閱Error
事件和手動一旦發生任何枚舉該目錄的內容。
爲了詳細說明喬恩的回答是:
還有另一種可能的解決方案,從發生的歷史推遲緩衝區溢出。通過處理您監控的事件,例如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);
}
,可以找到有關這種(包括樣本代碼的更多信息)在我兩年前寫的一篇文章中:
- 1. FileSystemWatcher無法正常工作WPF
- 2. START_STICKY無法正常工作
- 3. DataTrigger無法正常工作
- 4. YTPlayerView無法正常工作
- 5. @ Html.ValidationMessageFor無法正常工作
- 6. AppDomain.CurrentDomain.SetupInformation.ConfigurationFile無法正常工作
- 7. .fadeIn()無法正常工作
- 8. OnTouchListener無法正常工作
- 9. .htaccess無法正常工作
- 10. glTexSubImage2D無法正常工作
- 11. $ ionicScrollDelegate.getScrollPosition無法正常工作
- 12. Seekbar無法正常工作
- 13. onProviderEnabled無法正常工作?
- 14. Validation.HasError無法正常工作
- 15. Math.h無法正常工作?
- 16. document.createElement無法正常工作
- 17. Input.GetKeyDown無法正常工作
- 18. Bootstrap無法正常工作
- 19. PIDinRootline無法正常工作
- 20. PushNotification無法正常工作
- 21. wcstok()無法正常工作?
- 22. mapView:didSelectAnnotationView:無法正常工作。
- 23. killBackgroundProcesses無法正常工作
- 24. Bootstrap無法正常工作
- 25. uibarbuttonitem無法正常工作
- 26. MessageFormat無法正常工作
- 27. json_decode無法正常工作
- 28. mediaplayer無法正常工作
- 29. Viewpager無法正常工作
- 30. TransactionTimeout無法正常工作