我有一個函數,用於檢查目錄中的每個文件並將列表寫入控制檯。問題是,我不希望它包含當前正在複製到目錄的文件,我只希望它顯示已完成的文件。我怎麼做?這裏是我的代碼:顯示目錄中的每個文件,但不顯示當前正在複製的文件
foreach (string file in Directory.EnumerateFiles("C:\folder"))
{
Console.WriteLine(file);
}
我有一個函數,用於檢查目錄中的每個文件並將列表寫入控制檯。問題是,我不希望它包含當前正在複製到目錄的文件,我只希望它顯示已完成的文件。我怎麼做?這裏是我的代碼:顯示目錄中的每個文件,但不顯示當前正在複製的文件
foreach (string file in Directory.EnumerateFiles("C:\folder"))
{
Console.WriteLine(file);
}
沒有「當前文件被複制」列表存儲在Windows/.NET /任何地方的任何地方。可能最能做的就是試圖打開每個文件進行追加並查看是否有異常。根據目錄的大小和位置以及安全設置,這可能不是一個選項。
沒有一個乾淨的方式做到這一點,但是這...工程...
foreach (var file in new DirectoryInfo(@"C:\Folder").GetFiles())
{
try
{
file.OpenRead();
}
catch
{
continue;
}
Console.WriteLine(file.Name);
}
真的沒有辦法告訴「複製」與「被什麼東西鎖定爲寫作」。相關: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
塊結束)的文件可以通過別的東西我不知道究竟你在做什麼在這裏,但它聽起來就像兩個進程共享隊列目錄:一個寫,一個讀/處理。最大的挑戰是編寫一個文件需要時間,所以你的「閱讀」過程最終會在整個文件存在之前嘗試讀取它,這在某種程度上會失敗,這取決於共享模式,應用程序的方式寫等
一個常見的模式來處理這種情況是使用像Move
原子文件操作:
由於移動是原子性的,因此文件將不在那裏,或者它將100%存在 - 沒有機會讓「讀取」進程在部分文件中看到文件。
請注意,如果您跨文件系統進行移動,它將與副本一樣。
您的應用程序是否複製文件?如果是這樣,您可以將要複製的每個文件的名稱添加到列表中,並打印出不在列表中的文件。 – PoweredByOrange
「當前正在複製」在問題的上下文中,「當前」的定義是什麼? – Learner
[XY問題](http://meta.stackexchange.com/questions/66377/)。你爲什麼在乎?如何知道答案對你有幫助?如果一個文件在創建列表時沒有被「複製到」目錄,但在顯示「控制檯」之後會發生什麼? –