簡體   English   中英

如何使用“Directory.getFiles”獲取具有特定擴展名的磁盤上的所有文件並將其保存在列表中

[英]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包含讀取。

您可以采取兩項措施來改進該代碼:

  1. 使用Directory.EnumerateFiles()Directory.EnumerateDirectories()可以避免復制每個目錄中的所有文件的名稱。
  2. 使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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM