2009-12-09 28 views
2

當我運行下面的代碼時,它會用指定目錄中的文件列表填充我的數組。忽略飛行中的文件

這很好。

但是,它也會抓取'正在運行'的文件,即當前正在複製到該目錄的文件。

這很糟糕。

我該如何着手忽略那些'正在飛行'的文件?有沒有辦法在處理之前檢查每個文件以確保它「完全存在」?

string[] files = Directory.GetFiles(ConfigurationSettings.AppSettings.Get("sourcePath")); 
     if (files.Length > 0) 
     { 

      foreach (string filename in files) 
      { 
       string filenameonly = Path.GetFileName(filename); 
       AMPFileEntity afe = new AMPFileEntity(filenameonly); 
       afe.processFile(); 
      } 

     } 
+0

+1 Flying files ...有一個新文件 – MaLio 2009-12-09 21:23:26

回答

4

是的,您可以嘗試打開文件進行書寫。如果你能夠在沒有例外的情況下開放寫作,那麼它可能不再是「在飛行中」。不幸的是,我之前幾次遇到過這個問題,並沒有遇到更好的解決方案。

0

嘗試重命名/移動文件。如果你可以重命名它,它不再被使用。

+0

它已不再使用。重命名完成的那一刻就可以再次使用。你無法控制文件系統:) – JaredPar 2009-12-09 18:43:59

5

不幸的是,沒有辦法實現你正在尋找的東西。打開文件進行寫入的羅伯特的建議解決這個問題的一個子集,但不解決更大的問題是

的文件系統爲過,你有沒有同步功能的多線程對象的最佳效果

無論您嘗試使用哪種同步構造將文件系統置於「已知狀態」,都有一種方法可讓用戶擊敗它。

解決此問題的最佳方法是正常處理文件並捕獲使用「正在運行」文件導致的異常。這是處理文件系統的唯一理智方式。

+0

這是一個很好的解釋。 – 2009-12-09 18:42:23

1
  1. 獲取目錄中的文件列表。
  2. 獲取打開的手柄列表(請參閱下文)。
  3. 從前者中刪除後者。

您可以通過p/invoking NtQuerySystemInformation獲取打開句柄的列表。有a project on CodeProject顯示如何做到這一點。或者,您可以從Sysinternals調用Handle.exe,並解析其輸出。

0

卡拉的回答給了我一個主意。

如果您有機會獲得程序,將文件複製到該目錄下,修改它,使它:

  1. 文件寫入到一個臨時目錄在同一磁盤上。
  2. 將文件寫入磁盤後,將文件移至相應的文件夾。

在同一文件系統上,移動操作只是更新目錄條目而不是更改磁盤上文件的物理位置。這意味着它非常快速。

+0

如果你想要真正的可靠性,這仍然無法正常工作。機器上的其他進程可以決定刪除該新文件夾。你無法阻止這種情況發生。文件系統基本上是不可預測的 – JaredPar 2009-12-09 21:05:16