![](/img/trans.png)
[英]Using Directory.GetFiles() to select all the files but a certain extension
[英]How can i get all files on disk with a specific extension using 'Directory.getFiles' and save them in a list
我正在做一個控制台項目,其目標是在整個磁盤上搜索擴展名為“.config”的所有文件
我嘗試過類似的東西:
foreach (string file in Directory.GetFiles("C:\\", "*.config", SearchOption.AllDirectories))
{
Console.WriteLine(file);
Console.ReadLine();
}
但給了我一個錯誤“拒絕訪問路徑(...)”。
在互聯網上,我發現這個代碼:
Stack<string> pending = new Stack<string>();
pending.Push("C:\\");
while (pending.Count != 0)
{
var path = pending.Pop();
string[] next = null;
try
{
next = Directory.GetFiles(path, "*.config");
}
catch { }
if (next != null && next.Length != 0)
foreach (var file in next)
{
Console.WriteLine(file);
Console.ReadLine();
}
try
{
next = Directory.GetDirectories(path);
foreach (var subdir in next) pending.Push(subdir);
}
catch { }
}
但它只顯示總是在'enter'中單擊的路徑,我想在列表中保存這些文件/路徑。
有人可以幫忙嗎?
替換線
Console.WriteLine(file);
Console.ReadLine();
用一種方法將它們存儲在列表中。
例如
foundFiles.Add(file);
然后,當方法完成后,您可以從此列表中讀取所有找到的文件路徑。
筆記:
這不會產生系統上與過濾器匹配的所有文件。
只有這樣才能找到應用程序可以訪問其各自目錄的文件。
例如,其他用戶的Windows目錄和用戶目錄通常受到保護。 (假設您在Windows上運行)
請記住,某些文件可能會受到獨立於其目錄的保護。
因此,在嘗試閱讀它們時,還要考慮讀取可能失敗的事實。
只是用try catch包含讀取。
您可以采取兩項措施來改進該代碼:
Directory.EnumerateFiles()
和Directory.EnumerateDirectories()
可以避免復制每個目錄中的所有文件的名稱。 IEnumerable<string>
方法的返回類型更容易使用。 我們還需要非常小心嘗試訪問受保護文件和目錄所導致的異常。 下面的代碼也很復雜,因為你不允許從try/catch
塊中yield return
,所以我們必須稍微重新排列代碼。
(另請注意,我們必須處理從.GetEnumerator()
返回的枚舉器;通常這是在使用foreach
時自動完成的,但在這種情況下我們不能 - 因為必須避免在try/catch
執行yield return
-所以我們必須使用using
處置它。)
以下是對原始代碼的修改:
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);
}
}
}
}
}
例如,以下是如何使用控制台應用程序列出“C:\\”驅動器上所有可訪問的“.txt”文件:
static void Main()
{
foreach (var file in GetFiles("C:\\", "*.txt"))
{
Console.WriteLine(file);
}
}
關於錯誤“拒絕訪問路徑(...)”,有時您必須以管理員身份運行Visual Studio才能訪問C:\\驅動器中的某些文件夾。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.