亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用“Directory.getFiles”獲取磁盤上具有特定擴展名的所有文件并將它們

如何使用“Directory.getFiles”獲取磁盤上具有特定擴展名的所有文件并將它們

C#
HUWWW 2023-08-13 16:00:54
我正在做一個控制臺項目,其目標是在整個磁盤中搜索擴展名為“.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 { }        }但它只是顯示始終單擊“輸入”的路徑,我想將這些文件/路徑保存在列表中。有人可以幫忙嗎?
查看完整描述

3 回答

?
繁星coding

TA貢獻1797條經驗 獲得超4個贊

您可以采取兩件事來改進該代碼:

  1. 使用Directory.EnumerateFiles()Directory.EnumerateDirectories()可以避免復制每個目錄中所有文件的名稱。

  2. 使方法的返回類型IEnumerable<string>更容易使用。

我們還需要非常小心由于嘗試訪問受保護的文件和目錄而導致的異常。下面的代碼也很復雜,因為您不允許在塊yield return內部進行操作try/catch,因此我們必須稍微重新排列代碼。

(另請注意,我們必須處置從 返回的枚舉器.GetEnumerator();通常,當您使用 時,這是自動完成的foreach,但在這種情況下我們不能 - 因為必須避免yield return在 a 中執行try/catch- 所以我們必須使用 useusing來處置它。)

以下是對原始代碼的修改:

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);

    }

}


查看完整回答
反對 回復 2023-08-13
?
慕的地10843

TA貢獻1785條經驗 獲得超8個贊

更換線路

Console.WriteLine(file);
Console.ReadLine();

用一種方法將它們存儲在列表中。
例如

foundFiles.Add(file);

然后,當該方法完成時,您可以從此列表中讀取所有找到的文件路徑。

注意:
這不會產生系統上與過濾器匹配的所有文件。
只有您的應用程序有權訪問其各自目錄的文件才能通過這種方式找到。
例如,Windows目錄和其他用戶的用戶目錄通常受到保護。(假設您在 Windows 上運行)

請記住,某些文件可能會獨立于其目錄而受到保護。
因此,當嘗試讀取它們時,還要考慮讀取可能會失敗的事實。
只需用 try catch 包圍讀取即可。


查看完整回答
反對 回復 2023-08-13
?
人到中年有點甜

TA貢獻1895條經驗 獲得超7個贊

關于錯誤“拒絕訪問路徑(...)”,有時您必須以管理員身份運行 Visual Studio 才能訪問 C:\ 驅動器中的某些文件夾。



查看完整回答
反對 回復 2023-08-13
  • 3 回答
  • 0 關注
  • 209 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號