遍歷文件系統(tǒng)目錄樹的深入理解
更新時(shí)間:2013年05月31日 14:55:04 作者:
本篇文章是對遍歷文件系統(tǒng)目錄樹進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
在c#中可以遍歷指定驅(qū)動器或指定目錄下嵌套目錄中的所有文件或者任意深度的文件。通過遍歷可以檢索string形式的目錄名和文件名,也可以檢索 System.IO.FileInfo 或 System.IO.DirectoryInfo 對象形式的其他信息。可以通過遞歸遍歷和堆棧遍歷兩種方式實(shí)現(xiàn)目錄遍歷。
遞歸遍歷
遞歸算法簡單,但嵌套樹太深,可能會引起堆棧溢出異常。
/// <summary>
/// 通過遞歸方式訪問目錄樹
/// </summary>
class RecursiveAccessDirectory
{
//聲明并實(shí)例化一個(gè)字符串集合
static System.Collections.Specialized.StringCollection log
= new System.Collections.Specialized.StringCollection();
static void Main()
{
/*該部門代碼循環(huán)訪問本機(jī)所有驅(qū)動器上的文件
*
*
//返回計(jì)算機(jī)邏輯驅(qū)動器名稱的字符串?dāng)?shù)組
//包括光驅(qū)及連接計(jì)算機(jī)的移動驅(qū)動器
string[] drives = System.Environment.GetLogicalDrives();
foreach (string dr in drives)
{
System.IO.DriveInfo di = new System.IO.DriveInfo(dr);
if (!di.IsReady)
{
Console.WriteLine("驅(qū)動器 {0} 不能讀出", di.Name);
continue;
}
System.IO.DirectoryInfo rootDir = di.RootDirectory;
WalkDirectoryTree(rootDir);
}
*/
/*循環(huán)訪問指定目錄下的文件夾
*
*/
System.IO.DirectoryInfo rootDir = new System.IO.DirectoryInfo(@"C:\test");
WalkDirectoryTree(rootDir);
Console.WriteLine("限制用戶訪問文件:");
foreach (string s in log)
{
Console.WriteLine(s);
}
Console.Read();
}
static void WalkDirectoryTree(System.IO.DirectoryInfo root)
{
System.IO.FileInfo[] files = null;
System.IO.DirectoryInfo[] subDirs = null;
try
{
//GetFiles方法的參數(shù)可以包含通配符。
//即使目錄下沒有匹配的文件,返回長度為0不為空的數(shù)組對象,
//所以遞歸函數(shù)可以放在if (files != null)里。
//下面為查找所有有后綴名的文件。
files = root.GetFiles("*.*");
}
//請求權(quán)限超過應(yīng)用程序提供權(quán)限拋出異常
catch (System.UnauthorizedAccessException e)
{
//在訪問某個(gè)文件夾遭受拒絕時(shí),
//您可以提升自己的權(quán)限,然后再次訪問它。
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("{0}: {1} {2}", fi.FullName, fi.Length, fi.CreationTime);
}
subDirs = root.GetDirectories();
foreach (System.IO.DirectoryInfo dirInfo in subDirs)
{
WalkDirectoryTree(dirInfo);
}
}
}
}
堆棧遍歷
利用泛型 Stack<T> 集合類型實(shí)現(xiàn),該類型是一個(gè)后進(jìn)先出 (LIFO) 堆棧。
/// <summary>
/// 通過堆棧方式訪問目錄樹
/// </summary>
class StackAccessDirectory
{
static void Main()
{
TraverseTree(@"C:\test");
Console.Read();
}
public static void TraverseTree(string root)
{
Stack<string> dirs = new Stack<string>(20);
if (!System.IO.Directory.Exists(root))
{
throw new ArgumentException();
}
dirs.Push(root);
while (dirs.Count > 0)
{
string currDir = dirs.Pop();
string[] subDirs;
try
{
subDirs = System.IO.Directory.GetDirectories(currDir);
}
catch (System.UnauthorizedAccessException e)
{
Console.WriteLine(e.Message);
continue;
}
catch (System.IO.DirectoryNotFoundException e)
{
Console.WriteLine(e.Message);
continue;
}
string[] files=null;
try
{
files=System.IO.Directory.GetFiles(currDir);
}
catch(System.UnauthorizedAccessException e)
{
Console.WriteLine(e.Message);
continue;
}
catch(System.IO.DirectoryNotFoundException e)
{
Console.WriteLine(e.Message);
continue;
}
foreach (string file in files)
{
try
{
System.IO.FileInfo fi = new System.IO.FileInfo(file);
Console.WriteLine("{0}: {1} {2}", fi.Name, fi.Length, fi.CreationTime);
}
catch (System.IO.FileNotFoundException e)
{
Console.WriteLine(e.Message);
continue;
}
}
foreach (string str in subDirs)
dirs.Push(str);
}
}
}
遞歸遍歷
遞歸算法簡單,但嵌套樹太深,可能會引起堆棧溢出異常。
復(fù)制代碼 代碼如下:
/// <summary>
/// 通過遞歸方式訪問目錄樹
/// </summary>
class RecursiveAccessDirectory
{
//聲明并實(shí)例化一個(gè)字符串集合
static System.Collections.Specialized.StringCollection log
= new System.Collections.Specialized.StringCollection();
static void Main()
{
/*該部門代碼循環(huán)訪問本機(jī)所有驅(qū)動器上的文件
*
*
//返回計(jì)算機(jī)邏輯驅(qū)動器名稱的字符串?dāng)?shù)組
//包括光驅(qū)及連接計(jì)算機(jī)的移動驅(qū)動器
string[] drives = System.Environment.GetLogicalDrives();
foreach (string dr in drives)
{
System.IO.DriveInfo di = new System.IO.DriveInfo(dr);
if (!di.IsReady)
{
Console.WriteLine("驅(qū)動器 {0} 不能讀出", di.Name);
continue;
}
System.IO.DirectoryInfo rootDir = di.RootDirectory;
WalkDirectoryTree(rootDir);
}
*/
/*循環(huán)訪問指定目錄下的文件夾
*
*/
System.IO.DirectoryInfo rootDir = new System.IO.DirectoryInfo(@"C:\test");
WalkDirectoryTree(rootDir);
Console.WriteLine("限制用戶訪問文件:");
foreach (string s in log)
{
Console.WriteLine(s);
}
Console.Read();
}
static void WalkDirectoryTree(System.IO.DirectoryInfo root)
{
System.IO.FileInfo[] files = null;
System.IO.DirectoryInfo[] subDirs = null;
try
{
//GetFiles方法的參數(shù)可以包含通配符。
//即使目錄下沒有匹配的文件,返回長度為0不為空的數(shù)組對象,
//所以遞歸函數(shù)可以放在if (files != null)里。
//下面為查找所有有后綴名的文件。
files = root.GetFiles("*.*");
}
//請求權(quán)限超過應(yīng)用程序提供權(quán)限拋出異常
catch (System.UnauthorizedAccessException e)
{
//在訪問某個(gè)文件夾遭受拒絕時(shí),
//您可以提升自己的權(quán)限,然后再次訪問它。
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("{0}: {1} {2}", fi.FullName, fi.Length, fi.CreationTime);
}
subDirs = root.GetDirectories();
foreach (System.IO.DirectoryInfo dirInfo in subDirs)
{
WalkDirectoryTree(dirInfo);
}
}
}
}
堆棧遍歷
利用泛型 Stack<T> 集合類型實(shí)現(xiàn),該類型是一個(gè)后進(jìn)先出 (LIFO) 堆棧。
復(fù)制代碼 代碼如下:
/// <summary>
/// 通過堆棧方式訪問目錄樹
/// </summary>
class StackAccessDirectory
{
static void Main()
{
TraverseTree(@"C:\test");
Console.Read();
}
public static void TraverseTree(string root)
{
Stack<string> dirs = new Stack<string>(20);
if (!System.IO.Directory.Exists(root))
{
throw new ArgumentException();
}
dirs.Push(root);
while (dirs.Count > 0)
{
string currDir = dirs.Pop();
string[] subDirs;
try
{
subDirs = System.IO.Directory.GetDirectories(currDir);
}
catch (System.UnauthorizedAccessException e)
{
Console.WriteLine(e.Message);
continue;
}
catch (System.IO.DirectoryNotFoundException e)
{
Console.WriteLine(e.Message);
continue;
}
string[] files=null;
try
{
files=System.IO.Directory.GetFiles(currDir);
}
catch(System.UnauthorizedAccessException e)
{
Console.WriteLine(e.Message);
continue;
}
catch(System.IO.DirectoryNotFoundException e)
{
Console.WriteLine(e.Message);
continue;
}
foreach (string file in files)
{
try
{
System.IO.FileInfo fi = new System.IO.FileInfo(file);
Console.WriteLine("{0}: {1} {2}", fi.Name, fi.Length, fi.CreationTime);
}
catch (System.IO.FileNotFoundException e)
{
Console.WriteLine(e.Message);
continue;
}
}
foreach (string str in subDirs)
dirs.Push(str);
}
}
}
相關(guān)文章
C#實(shí)現(xiàn)的字符串轉(zhuǎn)MD5碼函數(shù)實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)的字符串轉(zhuǎn)MD5碼函數(shù),結(jié)合簡單實(shí)例形式分析了C#字符串的轉(zhuǎn)換、遍歷、加密等操作技巧,需要的朋友可以參考下2016-07-07
C#實(shí)現(xiàn)字符串倒序遍歷的方法小結(jié)
這篇文章主要為大家詳細(xì)介紹了C#中實(shí)現(xiàn)字符串倒序遍歷的常見方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考下2024-02-02
DevExpress實(shí)現(xiàn)TreeList按條件隱藏節(jié)點(diǎn)CheckBox的方法
這篇文章主要介紹了DevExpress實(shí)現(xiàn)TreeList按條件隱藏節(jié)點(diǎn)CheckBox的方法,需要的朋友可以參考下2014-08-08
C#實(shí)現(xiàn)向函數(shù)傳遞不定參數(shù)的方法
這篇文章主要介紹了C#實(shí)現(xiàn)向函數(shù)傳遞不定參數(shù)的方法,涉及C#操作函數(shù)參數(shù)的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04

