2013-07-19 44 views
-1

我有一個函數,用於檢查目錄中的每個文件並將列表寫入控制檯。問題是,我不希望它包含當前正在複製到目錄的文件,我只希望它顯示已完成的文件。我怎麼做?這裏是我的代碼:顯示目錄中的每個文件,但不顯示當前正在複製的文件

foreach (string file in Directory.EnumerateFiles("C:\folder")) 
     { 
      Console.WriteLine(file); 
     } 
+0

您的應用程序是否複製文件?如果是這樣,您可以將要複製的每個文件的名稱添加到列表中,並打印出不在列表中的文件。 – PoweredByOrange

+1

「當前正在複製」在問題的上下文中,「當前」的定義是什麼? – Learner

+1

[XY問題](http://meta.stackexchange.com/questions/66377/)。你爲什麼在乎?如何知道答案對你有幫助?如果一個文件在創建列表時沒有被「複製到」目錄,但在顯示「控制檯」之後會發生什麼? –

回答

1

沒有「當前文件被複制」列表存儲在Windows/.NET /任何地方的任何地方。可能最能做的就是試圖打開每個文件進行追加並查看是否有異常。根據目錄的大小和位置以及安全設置,這可能不是一個選項。

1

沒有一個乾淨的方式做到這一點,但是這...工程...

foreach (var file in new DirectoryInfo(@"C:\Folder").GetFiles()) 
{ 
    try 
    { 
     file.OpenRead(); 
    } 
    catch 
    { 
     continue; 
    } 
    Console.WriteLine(file.Name); 
} 
3

真的沒有辦法告訴「複製」與「被什麼東西鎖定爲寫作」。相關:How to check for file lock?Can I simply 'read' a file that is in use?

如果你想簡單地顯示未打開,無法寫入文件的列表,你可以做到這一點試圖打開他們:

foreach (string file in Directory.EnumerateFiles("C:\folder")) 
{ 
    try { 
    using (var file = file.Open(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) { 
     Console.WriteLine(file); 
    } 
    } catch { 
    // file is in use 
    continue; 
    } 
} 

但是 - 很多需要注意的地方。

  • ,立即顯示的文件名(在using塊結束)的文件可以通過別的東西
  • 寫入文件的過程中可能使用了FileShare.Read這意味着呼叫將成功打開儘管它是後寫入。

我不知道究竟你在做什麼在這裏,但它聽起來就像兩個進程共享隊列目錄:一個寫,一個讀/處理。最大的挑戰是編寫一個文件需要時間,所以你的「閱讀」過程最終會在整個文件存在之前嘗試讀取它,這在某種程度上會失敗,這取決於共享模式,應用程序的方式寫等

一個常見的模式來處理這種情況是使用像Move原子文件操作:

  • 執行(慢)寫/複製操作到一個臨時目錄是在相同的文件系統(非常重要)作爲隊列目錄
  • 一旦完成,做一個從臨時移動ry目錄到隊列目錄。

由於移動是原子性的,因此文件將不在那裏,或者它將100%存在 - 沒有機會讓「讀取」進程在部分文件中看到文件。

請注意,如果您跨文件系統進行移動,它將與副本一樣。

相關問題