继续Foreach循环出错

时间:2015-12-28 16:34:47

标签: c# foreach

我想在错误出现时继续我的代码,但我不知道如何......

这是我的代码:

foreach(string path in Directory.GetDirectories(@"C:\", "*.*", SearchOption.AllDirectories)
{
    Console.WriteLine(path);
}

错误发生在foreach(string path in Directory.GetDirectories(@"C:\", "*.*", SearchOption.AllDirectories),我不知道如何继续这个循环

和错误:

  

未经授权的访问

即使我以管理员身份运行我的代码,这个错误也会再次出现

谢谢,

3 个答案:

答案 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.GetAccessControlPermissionSet

,还有更多complicated ways of doing

希望它可以澄清。

答案 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);
            }
        }