1

我正在尝试获取 W7 机器的 c:\Users\UserName 目录中所有文件夹的列表。

我使用Directory.GetDirectories()or时遇到的问题Directory.GetFiles()是我经常遇到“访问路径被拒绝”的异常。我在管理员模式下运行了 VS,但没有运气。我的 C# 中解释了原因- 无法访问所有文件

我想知道如何获取所有子文件夹的名称(无论文件夹中是否有任何文件),其中子文件夹可能是 N 深(因此,子文件夹的数量不确定)并将它们存储为列表。这样,通过 foreach 循环,我可以根据某些逻辑逐个文件夹检查,以确保我可以访问并且我想要访问!

以下代码仅查看 1 级深度:

 private List<string> GetAllFolders()
 {
     DirectoryInfo directoryInfo = new DirectoryInfo(this.sourceFolder);
     List<string> allFolders = new List<string>();

     foreach (DirectoryInfo subDirectoryInfo in directoryInfo.GetDirectories())
     {
         //logic
         allFolders.Add(subDirectoryInfo.FullName);
     }
     return allFolders;
 }

有没有我可以使用的模式,或者有没有人有关于如何继续的例子或建议?

4

3 回答 3

3

你快到了。

private List<string> GetAllFolders()
{
    DirectoryInfo directoryInfo = new DirectoryInfo(this.sourceFolder);
    List<string> allFolders = new List<string>();

    foreach (DirectoryInfo subDirectoryInfo in directoryInfo.GetDirectories(("*.*", SearchOption.AllDirectories))
    {
        //logic
        allFolders.Add(subDirectoryInfo.FullName);
    }
    return allFolders;
}

关于访问权限,您可能无法访问每个文件夹的末尾,但我认为某些特殊文件夹会发生这种情况,您必须以某种方式自行处理。否则这工作正常。

另请参阅:迭代文件夹和子文件夹的最佳方法

于 2012-10-28T13:24:42.287 回答
1

我没有运行此代码,但您必须递归地遍历文件夹。我没有添加任何异常处理,除了'catch and continue'

private List<string> GetAllFolders()
{
   var allFolders = new List<string>();
   return GetAllFolders(this.sourceFolder);  
}

// recursively list all folders, catch and continue in case of errors
private List<string> GetAllFolders(string folder)
{
     DirectoryInfo directoryInfo = new DirectoryInfo(folder);
     List<string> allFolders = new List<string>();

     foreach (DirectoryInfo subDirectoryInfo in directoryInfo.GetDirectories())
     {
          //logic
         try {
           allFolders.Add(subDirectoryInfo.FullName);
          allFolders.AddRange(GetAllFolders(subDirectoryInfo.FullName));
        }
        catch (Exception exp)
        {
          // log rrors
          Debug.WriteLine(" exception for " + 
                              subDirectoryInfo.FullName + " : " + 
                            exp.Message);
                } 
            }
            return allFolders;
        }
于 2012-10-28T13:25:27.487 回答
1
public void GetFolderList()
{
    var list = new List<string>();
    var root = new DirectoryInfo("c:\\");
    GetFoldersRecursive(root, list);
}

private static void GetFoldersRecursive(DirectoryInfo root, List<string> list)
{
    DirectoryInfo[] children;
    try
    {
        list.Add(root.FullName);
        children = root.GetDirectories();
    }
    catch(UnauthorizedAccessException t)
    {
        // access denied
        return;
    }

    foreach (var d in children)
        GetFoldersRecursive(d, list);
}

如果您更喜欢使用更复杂的权限检查(而不是捕获异常),我建议您看看这里

于 2012-10-28T13:32:17.620 回答