就在今天我遇到了同样的问题。我一起砍了下面的代码。如果您想在实际产品中使用它,则可能需要改进错误处理。由于这是一个一次性脚本,我并不在乎。
static IEnumerable<string> EnumerateFilesRecursive(string root,string pattern="*")
{
var todo = new Queue<string>();
todo.Enqueue(root);
while (todo.Count > 0)
{
string dir = todo.Dequeue();
string[] subdirs = new string[0];
string[] files = new string[0];
try
{
subdirs = Directory.GetDirectories(dir);
files = Directory.GetFiles(dir, pattern);
}
catch (IOException)
{
}
catch (System.UnauthorizedAccessException)
{
}
foreach (string subdir in subdirs)
{
todo.Enqueue(subdir);
}
foreach (string filename in files)
{
yield return filename;
}
}
}
要使用它,您可以:
string[] files = EnumerateFilesRecursive(@"C:\").ToArray();//Note the ToArray()
foreach (string file in files)
{
Console.WriteLine(file);
}
其中第一枚举所有文件,存储在内存中的所有文件名,然后才显示出来。或者,您可以:
IEnumerable<string> files = EnumerateFilesRecursive(@"C:\");//Note that there is NO ToArray()
foreach (string file in files)
{
Console.WriteLine(file);
}
它在枚举时写入,因此不需要同时在内存中保留所有文件名。
非常好,非常感谢分享你的代码。我无法弄清楚如何让它工作,但我对C#不是非常有经验。我试图把它作为一种方法,假设字符串根和字符串模式是args但没有运气,我只是想用Console.WriteLine()将它输出到控制台,我在哪里适合它?谢谢! –
我希望我能给你+100!这很好,非常感谢你! –