首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 遞歸遍歷目錄獲取所有文件(含子目錄)

     編輯:程式設計綜合問答

需求分析

需要編寫 C# 代碼,給定一個根目錄路徑,遞歸獲取該目錄及所有子目錄下的每一個文件完整路徑。

核心遞歸算法

遞歸是解決樹狀結構(目錄樹)遍歷的自然選擇。Directory.GetFiles 可獲取當前目錄文件,Directory.GetDirectories 獲取子目錄,隨後對每個子目錄遞歸調用同一方法。

完整代碼範例

using System;
using System.Collections.Generic;
using System.IO;

public class FileScanner
{
    public static List<string> GetAllFiles(string rootPath)
    {
        var result = new List<string>();
        try
        {
            // 1. 獲取當前目錄所有文件
            result.AddRange(Directory.GetFiles(rootPath));

            // 2. 遞歸處理子目錄
            foreach (var dir in Directory.GetDirectories(rootPath))
            {
                result.AddRange(GetAllFiles(dir));
            }
        }
        catch (UnauthorizedAccessException)
        {
            // 忽略無權限目錄,或記錄日誌
        }
        catch (PathTooLongException)
        {
            // 處理路徑過長
        }
        return result;
    }
}

// 調用示例
var allFiles = FileScanner.GetAllFiles(@"C:\Projects");
foreach (var f in allFiles) Console.WriteLine(f);

非遞歸替代方案

若目錄層級極深可能導致堆疊溢出,可使用 堆疊/佇列 實現迭代式遍歷:

public static IEnumerable<string> GetAllFilesIterative(string root)
{
    var stack = new Stack<string>();
    stack.Push(root);
    while (stack.Count > 0)
    {
        var current = stack.Pop();
        foreach (var file in Directory.GetFiles(current)) yield return file;
        foreach (var dir in Directory.GetDirectories(current)) stack.Push(dir);
    }
}

總結

遞歸代碼簡潔易懂,適合大多數業務場景;極深目錄結構建議改用迭代避免 StackOverflowException。記得處理權限與路徑長度異常。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved