我想在错误出现时继续我的代码,但我不知道如何......
这是我的代码:
foreach(string path in Directory.GetDirectories(@"C:\", "*.*", SearchOption.AllDirectories)
{
Console.WriteLine(path);
}
错误发生在foreach(string path in Directory.GetDirectories(@"C:\", "*.*", SearchOption.AllDirectories)
,我不知道如何继续这个循环
和错误:
未经授权的访问
即使我以管理员身份运行我的代码,这个错误也会再次出现
谢谢,
答案 0 :(得分:1)
最好是使用递归搜索而不使用SearchOption.AllDirectories
,而是使用SearchOption.TopDirectoryOnly
如果您使用SearchOption.AllDirectories
,一次访问冲突将在处理任何文件/目录之前中断整个循环。但是,如果您使用SearchOption.TopDirectoryOnly
,则只会跳过无法访问的内容。
因此,为此,您可以创建一个接收目录路径作为输入的方法。在该方法中,如果输入目录具有子目录(请参阅Directory.GetDirectories(string path)
方法,则在处理目录中的所有文件之前,再次为每个子目录(递归调用)调用该方法。否则,获取目录中的文件(请参阅Directory.GetFiles
)并立即处理它们。
然后对于上面的方法,一种方法是当你无法访问某个文件/目录时,通过对每个子目录读取和文件读取使用try-catch
块来防止代码崩溃。这样,如果无法访问一个文件/文件夹,您的代码仍将运行,找到处理下一个文件/目录。
或者,您可以使用每个子目录检查Directory.GetAccessControl()
来查看您是否有权访问Directory
(此选项相当困难)。
编辑(已添加代码):
这样的事情会:
public static List<string> GetAllAccessibleDirectories(string path, string searchPattern) {
List<string> dirPathList = new List<string>();
try {
List<string> childDirPathList = Directory.GetDirectories(path, searchPattern, SearchOption.TopDirectoryOnly).ToList(); //use TopDirectoryOnly
if (childDirPathList == null || childDirPathList.Count <= 0) //this directory has no child
return null;
foreach (string childDirPath in childDirPathList) { //foreach child directory, do recursive search
dirPathList.Add(childDirPath); //add the path
List<string> grandChildDirPath = GetAllAccessibleDirectories(childDirPath, searchPattern);
if (grandChildDirPath != null && grandChildDirPath.Count > 0) //this child directory has children and nothing has gone wrong
dirPathList.AddRange(grandChildDirPath.ToArray()); //add the grandchildren to the list
}
return dirPathList; //return the whole list found at this level
} catch {
return null; //something has gone wrong, return null
}
}
要打电话,你可以做这样的事情
string rootpath = @"C:\DummyRootFolder";
List<string> dirList = GetAllAccessibleDirectories(rootpath, "*.*"); //you get all accessible directories here
在dirList
中,您将获得您搜索的所有目录,如果在此过程中存在访问冲突,则由于try-catch
阻止,它将仅影响子目录搜索。 / p>
请注意,方法中不包括rootpath
。但是如果你想将它添加到列表中,你可以简单地执行
dirList.Insert(0, path); //do this after you get dirList
使用Directory.GetAccessControl
和PermissionSet
希望它可以澄清。
答案 1 :(得分:0)
根据文档,出于性能原因,您应该查看EnumerateDirectories:
https://msdn.microsoft.com/en-us/library/c1sez4sc(v=vs.110).aspx
此外,似乎此问题已在以前得到解答:
Directory.EnumerateFiles => UnauthorizedAccessException
希望这有帮助!
答案 2 :(得分:0)
这个怎么样:
foreach (string path in Directory.GetDirectories(@"C:\", "*.*", SearchOption.AllDirectories)) {
try {
Console.WriteLine(path);
} catch (Exception ex) {
Console.WriteLine("Unable to access directories in path: " + path);
}
}