/*
A Programmer's Introduction to C# (Second Edition)
by Eric Gunnerson
Publisher: Apress L.P.
ISBN: 1-893115-62-3
*/
// 32 - .NET Frameworks Overview\InputOutput\Traversing Directories
// copyright 2000 Eric Gunnerson
using System;
using System.IO;
class DirectoryWalker
{
public delegate void ProcessDirCallback(DirectoryInfo dir, int level, object obj);
public delegate void ProcessFileCallback(FileInfo file, int level, object obj);
public DirectoryWalker( ProcessDirCallback dirCallback,
ProcessFileCallback fileCallback)
{
this.dirCallback = dirCallback;
this.fileCallback = fileCallback;
}
public void Walk(string rootDir, object obj)
{
DoWalk(new DirectoryInfo(rootDir), 0, obj);
}
void DoWalk(DirectoryInfo dir, int level, object obj)
{
foreach (FileInfo f in dir.GetFiles())
{
if (fileCallback != null)
fileCallback(f, level, obj);
}
foreach (DirectoryInfo d in dir.GetDirectories())
{
if (dirCallback != null)
dirCallback(d, level, obj);
DoWalk(d, level + 1, obj);
}
}
ProcessDirCallback dirCallback;
ProcessFileCallback fileCallback;
}
public class TraversingDirectories
{
public static void PrintDir(DirectoryInfo d, int level, object obj)
{
WriteSpaces(level * 2);
Console.WriteLine("Dir: {0}", d.FullName);
}
public static void PrintFile(FileInfo f, int level, object obj)
{
WriteSpaces(level * 2);
Console.WriteLine("File: {0}", f.FullName);
}
public static void WriteSpaces(int spaces)
{
for (int i = 0; i < spaces; i++)
Console.Write(" ");
}
public static void Main(string[] args)
{
DirectoryWalker dw = new DirectoryWalker(
new DirectoryWalker.ProcessDirCallback(PrintDir),
new DirectoryWalker.ProcessFileCallback(PrintFile));
string root = ".";
if (args.Length == 1)
root = args[0];
dw.Walk(root, "Passed string object");
}
}