Ví dụ sau nhanh nhất (không song song) cách liệt kê các tệp và thư mục con trong thư mục xử lý ngoại lệ của cây thư mục. Sẽ nhanh hơn khi sử dụng Directory.EnumerateDirectories bằng cách sử dụng SearchOption.AllDirectories để liệt kê tất cả các thư mục, nhưng phương thức này sẽ thất bại nếu truy cập UnauthorizedAccessException hoặc PathTooLongException.
Sử dụng loại bộ sưu tập Ngăn xếp chung, đây là loại ngăn xếp cuối cùng trong lần đầu tiên (LIFO) và không sử dụng đệ quy. Từ https://msdn.microsoft.com/en-us/library/bb513869.aspx, cho phép bạn liệt kê tất cả các thư mục con và tệp và xử lý hiệu quả với những ngoại lệ đó.
public class StackBasedIteration
{
static void Main(string[] args)
{
// Specify the starting folder on the command line, or in
// Visual Studio in the Project > Properties > Debug pane.
TraverseTree(args[0]);
Console.WriteLine("Press any key");
Console.ReadKey();
}
public static void TraverseTree(string root)
{
// Data structure to hold names of subfolders to be
// examined for files.
Stack<string> dirs = new Stack<string>(20);
if (!System.IO.Directory.Exists(root))
{
throw new ArgumentException();
}
dirs.Push(root);
while (dirs.Count > 0)
{
string currentDir = dirs.Pop();
string[] subDirs;
try
{
subDirs = System.IO.Directory.EnumerateDirectories(currentDir); //TopDirectoryOnly
}
// An UnauthorizedAccessException exception will be thrown if we do not have
// discovery permission on a folder or file. It may or may not be acceptable
// to ignore the exception and continue enumerating the remaining files and
// folders. It is also possible (but unlikely) that a DirectoryNotFound exception
// will be raised. This will happen if currentDir has been deleted by
// another application or thread after our call to Directory.Exists. The
// choice of which exceptions to catch depends entirely on the specific task
// you are intending to perform and also on how much you know with certainty
// about the systems on which this code will run.
catch (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.EnumerateFiles(currentDir);
}
catch (UnauthorizedAccessException e)
{
Console.WriteLine(e.Message);
continue;
}
catch (System.IO.DirectoryNotFoundException e)
{
Console.WriteLine(e.Message);
continue;
}
// Perform the required action on each file here.
// Modify this block to perform your required task.
foreach (string file in files)
{
try
{
// Perform whatever action is required in your scenario.
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)
{
// If file was deleted by a separate application
// or thread since the call to TraverseTree()
// then just continue.
Console.WriteLine(e.Message);
continue;
}
catch (UnauthorizedAccessException e)
{
Console.WriteLine(e.Message);
continue;
}
}
// Push the subdirectories onto the stack for traversal.
// This could also be done before handing the files.
foreach (string str in subDirs)
dirs.Push(str);
}
}
}
Duyệt không gian tên System.IO cho [lớp] (http://msdn.microsoft.com/en-us/library/wa70yfe2 (v = vs.100)) và [phương pháp] (http://msdn.microsoft.com/en-us/library/dd383459 (v = vs.100)) có thể giúp bạn. – Lucero
Kiểm tra [câu hỏi này] (http://stackoverflow.com/q/1651869/335858) và thả phần mà anh ấy khớp với mẫu. – dasblinkenlight
bản sao có thể có của [Cách đệ quy liệt kê tất cả các tệp trong một thư mục trong C#?] (Http://stackoverflow.com/questions/929276/how-to-recursively-list-all-the-files-in-a- directory-in-c) – JoshRivers