Dot-Net
監控文件 - 如何知道文件何時完成
我們有幾個 .NET 應用程序使用 FileSystemWatcher 監視目錄中的新文件。文件從另一個位置複製,通過 FTP 等上傳。當它們進入時,文件以一種或另一種方式處理。然而,一個我從未見過滿意答案的問題是:對於大文件,如何知道被監視的文件何時仍在寫入?顯然,我們需要等到文件完成並關閉後再開始處理它們。FileSystemWatcher 事件中的事件參數似乎沒有解決這個問題。
如果您可以控制將文件寫入目錄的程序,則可以讓程序將文件寫入臨時目錄,然後將它們移動到監視目錄中。移動應該是一個原子操作,所以觀察者不應該看到文件,直到它完全在目錄中。
如果您無法控制寫入監視目錄的內容,您可以在監視程序中設置一個時間,當文件在給定時間內保持相同大小時,文件被認為是完整的。如果不考慮立即處理,則將此計時器設置為相對較大的值是一種相當安全的方法,可以知道文件是否完整或永遠不會。
在文件關閉之前,不應觸發 FileSystemWatcher 上的“已更改”事件。請參閱我對類似問題的回答。隨著新數據的進入,FTP下載機制有可能在下載過程中多次關閉文件,但我認為這不太可能。