我试图通过使用下面的代码,我的计算机上的文件枚举,但每次它击中一个文件或目录,我没有权限读取它抛出一个异常.抛出异常后有什么办法可以继续搜索吗?我知道有些人有类似的问题,除了单独检查每个文件/文件夹之外还有其他方法吗?
try
{
string[] files = Directory.GetFiles(@"C:\", *.*",SearchOption.AllDirectories);
foreach (string file in files)
{
Console.WriteLine(file);
}
}
catch
{
}
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助,因为这让我很生气!
Cod*_*aos 11
我今天遇到了同样的问题.我把以下代码一起攻击了.如果要在实际产品中使用它,可能需要改进错误处理.由于这是一次性脚本,我不在乎.
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
要使用它,您可以:
string[] files = EnumerateFilesRecursive(@"C:\").ToArray();//Note the ToArray()
foreach (string file in files)
{
Console.WriteLine(file);
}
Run Code Online (Sandbox Code Playgroud)
它首先枚举所有文件,将所有文件名存储在内存中,然后才显示它们.或者你可以:
IEnumerable<string> files = EnumerateFilesRecursive(@"C:\");//Note that there is NO ToArray()
foreach (string file in files)
{
Console.WriteLine(file);
}
Run Code Online (Sandbox Code Playgroud)
枚举时写入,因此不需要同时将所有文件名保留在内存中.
| 归档时间: |
|
| 查看次数: |
989 次 |
| 最近记录: |