2011-03-15 52 views
0

使用類似這樣的東西是否安全以確保目錄當前未被寫入?DirectoryInfo.LastWriteTime是一種安全的方式來檢查文件是否仍在上傳?

Dim ImportDir As New DirectoryInfo("C:\MyPath\") 
If DateDiff(DateInterval.Minute, ImportDir.LastWriteTime, Now) < 10 Then 
    Exit Sub 
End If 

我處理可高達爲10MB,所以我主要的問題是我不知道的LastWriteTime屬性是否(這大概引用文件系統「最後修改」元數據)的圖像被更新時,首先,將文件的最後或每個字節寫入磁盤。

文件通常會通過IIS7 FTP上載到Windows 2008服務器上的NTFS文件系統。如果它依賴於文件系統,儘管知道哪些文件系統會更新。

編輯:我希望這可以用來簡化程序,確保整個目錄一次處理。最後,我決定重新考慮一下,因爲變通辦法比我試圖避免的變得更加混亂和不可靠!歡呼的答案雖然

+0

時間檢查通常是一個糟糕的主意:想象慢速連接(或一些重要的路由器問題w /丟失數據包)和一些緩衝。最後修改可能不會相應更新。最簡單的方法是嘗試打開文件進行寫入,否則將意味着文件仍處於鎖定狀態。 – bestsss 2011-03-15 13:31:30

回答

2

完全沒有。 LastWriteTime在寫入後更新,而不是寫入時。你需要依靠上傳的任何程序來鎖定文件。任何體面的人都會。因此,試圖用FileShare.Read或FileShare.None的FileStream構造函數打開文件將引發IOException。這幾乎總是有效的。

+0

感謝您的確認。我想我必須依次嘗試鎖定每個文件 – Phil 2011-03-15 14:30:01

2

我不完全確定你的方法會有多精確。但是,另一種解決方案是嘗試在try-catch中以獨佔模式(FileShare.None)打開文件,例如,

Dim fs As FileStream = File.Open(path, FileMode.Open, FileAccess.Write, FileShare.None); 

(顯然把它放在一個try-catch內)

雖然這被普遍認爲是例外編碼,它提供了一個替代方案確保該文件沒有被其他進程鎖定。

+0

無論提供構造名稱(由異常編碼)的專家的名字可能是,它實際上是一個例外,試圖打開一個鎖定的文件。依靠這個例外在我的書中完美無缺(只是放棄了關於意圖的單行註釋) – bestsss 2011-03-15 13:40:10

+0

感謝您的答案,但我需要知道目錄中的任何**文件是否正在使用,並獲取鎖定一個目錄是不可能的 – Phil 2011-03-15 14:30:27

+0

@Phil你可以枚舉目錄中的文件嗎? – 2011-03-15 14:44:38

相關問題