public class RecursiveFileSearch
{
static System.Collections.Specialized.StringCollection log = new System.Collections.Specialized.StringCollection();
static void Main()
{
// 檢測邏輯盤符
string[] drives = System.Environment.GetLogicalDrives();
foreach (string dr in drives)
{
System.IO.DriveInfo di = new System.IO.DriveInfo(dr);
//跳過沒有就緒的盤
if (!di.IsReady)
{
Console.WriteLine("The drive {0} could not be read", di.Name);
continue;
}
System.IO.DirectoryInfo rootDir = di.RootDirectory;
WalkDirectoryTree(rootDir);//遞歸
}
// 未能成功瀏覽的文件(權限不夠等原因)
Console.WriteLine("拒絕訪問的有:");
foreach (string s in log)
{
Console.WriteLine(s);
}
Console.ReadKey();
}
static void WalkDirectoryTree(System.IO.DirectoryInfo root)
{
System.IO.FileInfo[] files = null;
System.IO.DirectoryInfo[] subDirs = null;
//遍歷目錄下的所有文件夾
try
{
files = root.GetFiles("*.*");
}
//拒絕訪問導致的異常
catch (UnauthorizedAccessException e)
{
log.Add(e.Message);
}
//文件殘缺
catch (System.IO.DirectoryNotFoundException e)
{
Console.WriteLine(e.Message);
}
if (files != null)
{
foreach (System.IO.FileInfo fi in files)
{
//打印本目錄下所有文件名(不含文件夾)
Console.WriteLine(fi.FullName);
}
// 獲取子文件夾集合
subDirs = root.GetDirectories();
foreach (System.IO.DirectoryInfo dirInfo in subDirs)
{
//遞歸調用本方法應用于于子文件夾
WalkDirectoryTree(dirInfo);
}
}
}
}
復制代碼
遞歸方法很簡潔,但如果目錄樹很大且嵌套很深,則有可能會引起堆棧溢出異常。