递归遍历
递归算法简单,但嵌套树太深,可能会引起堆栈溢出异常。
复制代码 代码如下:
///
/// 通过递归方式访问目录树
///
class RecursiveAccessDirectory
{
//声明并实例化一个字符串集合
static System.Collections.Specialized.StringCollection log
= new System.Collections.Specialized.StringCollection();
static void Main()
{
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方法的参数可以包含通配符。
//即使目录下没有匹配的文件,返回长度为0不为空的数组对象,
//所以递归函数可以放在if (files != null)里。
//下面为查找所有有后缀名的文件。
files = root.GetFiles("*.*");
}
//请求权限超过应用程序提供权限抛出异常
catch (System.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("{0}: {1} {2}", fi.FullName, fi.Length, fi.CreationTime);
}
subDirs = root.GetDirectories();
foreach (System.IO.DirectoryInfo dirInfo in subDirs)
{
WalkDirectoryTree(dirInfo);
}
}
}
}
堆栈遍历
利用泛型 Stack
复制代码 代码如下:
///
/// 通过堆栈方式访问目录树
///
class StackAccessDirectory
{
static void Main()
{
TraverseTree(@"C:test");
Console.Read();
}
public static void TraverseTree(string root)
{
Stack
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);
}
}
}



