在嘗試完成重複文件軟件時,我注意到Directory.GetDirectories()方法存在問題。當文件夾因任何原因無法訪問時(大部分時間是由於該文件夾是系統文件夾),循環將停止,因爲會引發異常。如何判斷遞歸方法何時完成
經過一些研究,試圖找出什麼是最好的方法來做手動遞歸,我發現Marc Gravell's example這完全符合我的需求。
與上述方法我的問題是,我不知道如何才能知道何時遞歸方法已完成處理任何文件/文件夾。因此,有關這個問題的任何見解將不勝感激。
在此先感謝。
在嘗試完成重複文件軟件時,我注意到Directory.GetDirectories()方法存在問題。當文件夾因任何原因無法訪問時(大部分時間是由於該文件夾是系統文件夾),循環將停止,因爲會引發異常。如何判斷遞歸方法何時完成
經過一些研究,試圖找出什麼是最好的方法來做手動遞歸,我發現Marc Gravell's example這完全符合我的需求。
與上述方法我的問題是,我不知道如何才能知道何時遞歸方法已完成處理任何文件/文件夾。因此,有關這個問題的任何見解將不勝感激。
在此先感謝。
把一個消息框,操作comepletes後:
static void Main()
{
string path = ""; // TODO
ApplyAllFiles(path, ProcessFile, FolderProcessed);
MessageBox.Show("Operation complete.");
}
嗯,這很尷尬......看起來我的大腦因爲某種原因停止了正常運作,我一直在想,在遞歸發生時線程並未被阻塞。謝謝您的幫助。 – denied66
很高興有幫助,自從你提到線程以來最後一個註釋 - 請看看這個答案中的一些鏈接:http://stackoverflow.com/a/10965388/495455 –
謝謝澄清你對我的問題的評論,但我仍然無法看到如何使用進程欄來顯示進程。你不需要知道結果應該在什麼地方來說明這個過程嗎?目前的設計似乎沒有提供。以Marc Gravell的例子來說,似乎不可能知道需要緩存多少個文件,並且使用Directory.GetDirectories()會冒險獲取異常。謝天謝地,該方案並不涉及說明進展情況,因爲在這種情況下這似乎是一件困難的事情。 – denied66
你能澄清你想要做什麼嗎?
在Marc提供的示例代碼中,您必須提供一個將爲每個發現的文件調用的Action,因此調用該動作表示該文件的處理。
如果您正在尋找一種方法來確定文件夾中的所有文件和子文件夾何時被處理,您需要修改代碼以添加第二個操作。事情是這樣的:
using System;
using System.IO;
static class Program
{
static void Main()
{
string path = ""; // TODO
ApplyAllFiles(path, ProcessFile, FolderProcessed);
}
static void ProcessFile(string path) {/* ... */}
static void FolderProcessed(string path) {/* ... */}
static void ApplyAllFiles(string folder, Action<string> fileAction, Action<string> folderProcessed)
{
foreach (string file in Directory.GetFiles(folder))
{
fileAction(file);
}
foreach (string subDir in Directory.GetDirectories(folder))
{
try
{
ApplyAllFiles(subDir, fileAction);
}
catch
{
// swallow, log, whatever
}
}
//**** New action invoked here:
folderProcessed(folder);
}
}
這裏的問題是我需要知道當所有的文件或文件夾已被處理。根據你的意思,這意味着我已經有了一個數組,這些對象可以檢查以確認所有內容都已經過處理,這是問題,因爲我無法使用任何方法獲取文件夾/文件的數量其中之一可能是引發異常的文件夾。 – denied66
你想有一個進度條?您可以有一個名爲folderDepth的成員變量,並在方法遍歷文件夾層次結構時遞增/遞減。在運行該方法之前,先放入'Debug.Write(folderDepth)',你會得到一個想法*,可以更好地預測它何時完成。只是我的2美分:)渴望聽到這個現在的一些答案+1 –
目前主要關心的是找出何時搜索完成向用戶輸出消息。你對一個變量的建議意味着我需要知道已選擇的文件夾中有多少個文件夾,這是不可能的,至少不需要使用像Directory.GetDirectories()這樣的東西。長度 – denied66