3 回答

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超4個(gè)贊
您可以采取兩件事來(lái)改進(jìn)該代碼:
使用
Directory.EnumerateFiles()
和Directory.EnumerateDirectories()
可以避免復(fù)制每個(gè)目錄中所有文件的名稱(chēng)。使方法的返回類(lèi)型
IEnumerable<string>
更容易使用。
我們還需要非常小心由于嘗試訪問(wèn)受保護(hù)的文件和目錄而導(dǎo)致的異常。下面的代碼也很復(fù)雜,因?yàn)槟辉试S在塊yield return
內(nèi)部進(jìn)行操作try/catch
,因此我們必須稍微重新排列代碼。
(另請(qǐng)注意,我們必須處置從 返回的枚舉器.GetEnumerator()
;通常,當(dāng)您使用 時(shí),這是自動(dòng)完成的foreach
,但在這種情況下我們不能 - 因?yàn)楸仨毐苊?code>yield return在 a 中執(zhí)行try/catch
- 所以我們必須使用 useusing
來(lái)處置它。)
以下是對(duì)原始代碼的修改:
public static IEnumerable<string> GetFiles(string root, string spec)
{
var pending = new Stack<string>(new []{root});
while (pending.Count > 0)
{
var path = pending.Pop();
IEnumerator<string> fileIterator = null;
try
{
fileIterator = Directory.EnumerateFiles(path, spec).GetEnumerator();
}
catch {}
if (fileIterator != null)
{
using (fileIterator)
{
while (true)
{
try
{
if (!fileIterator.MoveNext()) // Throws if file is not accessible.
break;
}
catch { break; }
yield return fileIterator.Current;
}
}
}
IEnumerator<string> dirIterator = null;
try
{
dirIterator = Directory.EnumerateDirectories(path).GetEnumerator();
}
catch {}
if (dirIterator != null)
{
using (dirIterator)
{
while (true)
{
try
{
if (!dirIterator.MoveNext()) // Throws if directory is not accessible.
break;
}
catch { break; }
pending.Push(dirIterator.Current);
}
}
}
}
}
例如,以下是如何使用控制臺(tái)應(yīng)用程序列出“C:\”驅(qū)動(dòng)器上所有可訪問(wèn)的“.txt”文件:
static void Main()
{
foreach (var file in GetFiles("C:\\", "*.txt"))
{
Console.WriteLine(file);
}
}

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超8個(gè)贊
更換線路
Console.WriteLine(file); Console.ReadLine();
用一種方法將它們存儲(chǔ)在列表中。
例如
foundFiles.Add(file);
然后,當(dāng)該方法完成時(shí),您可以從此列表中讀取所有找到的文件路徑。
注意:
這不會(huì)產(chǎn)生系統(tǒng)上與過(guò)濾器匹配的所有文件。
只有您的應(yīng)用程序有權(quán)訪問(wèn)其各自目錄的文件才能通過(guò)這種方式找到。
例如,Windows目錄和其他用戶的用戶目錄通常受到保護(hù)。(假設(shè)您在 Windows 上運(yùn)行)
請(qǐng)記住,某些文件可能會(huì)獨(dú)立于其目錄而受到保護(hù)。
因此,當(dāng)嘗試讀取它們時(shí),還要考慮讀取可能會(huì)失敗的事實(shí)。
只需用 try catch 包圍讀取即可。

TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超7個(gè)贊
關(guān)于錯(cuò)誤“拒絕訪問(wèn)路徑(...)”,有時(shí)您必須以管理員身份運(yùn)行 Visual Studio 才能訪問(wèn) C:\ 驅(qū)動(dòng)器中的某些文件夾。
- 3 回答
- 0 關(guān)注
- 217 瀏覽
添加回答
舉報(bào)