需要編寫 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。記得處理權限與路徑長度異常。