C# 不使用预构建的.net对象获取所有子文件夹

C# 不使用预构建的.net对象获取所有子文件夹,c#,.net,path,C#,.net,Path,我正在尝试获取W7机器的c:\Users\UserName目录中所有文件夹的列表 当我使用Directory.GetDirectories()或Directory.GetFiles()时,我遇到的问题是,我经常遇到“拒绝访问路径”的异常。我在管理员模式下运行了VS,但运气不好。我的报告解释了原因 我想知道如何获取所有子文件夹的名称(无论文件夹中是否有任何文件),其中子文件夹可能是N深的(因此,子文件夹的数量不确定),并将其存储为列表。这样,通过foreach循环,我可以根据特定的逻辑逐个检查文件

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

当我使用
Directory.GetDirectories()
Directory.GetFiles()
时,我遇到的问题是,我经常遇到“拒绝访问路径”的异常。我在管理员模式下运行了VS,但运气不好。我的报告解释了原因

我想知道如何获取所有子文件夹的名称(无论文件夹中是否有任何文件),其中子文件夹可能是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;
 }
private List GetAllFolders()
{
DirectoryInfo DirectoryInfo=新的DirectoryInfo(this.sourceFolder);
List allFolders=新列表();
foreach(DirectoryInfo.GetDirectories()中的DirectoryInfo子目录yinfo)
{
//逻辑
添加(子目录yinfo.FullName);
}
返回所有文件夹;
}
是否有一种模式可以用于此,或者是否有人对如何继续进行有一个示例或建议?

您就快到了

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;
}
private List GetAllFolders()
{
DirectoryInfo DirectoryInfo=新的DirectoryInfo(this.sourceFolder);
List allFolders=新列表();
foreach(DirectoryInfo.GetDirectories((“**”,SearchOption.AllDirectories)中的DirectoryInfo子目录yinfo)
{
//逻辑
添加(子目录yinfo.FullName);
}
返回所有文件夹;
}
关于访问权限,您可能无法访问每个文件夹的末尾,但我认为在某些特殊文件夹中会发生这种情况,您必须以某种方式自行处理这些问题。否则,这种方法可以正常工作

另外,请看:

您就快到了

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;
}
private List GetAllFolders()
{
DirectoryInfo DirectoryInfo=新的DirectoryInfo(this.sourceFolder);
List allFolders=新列表();
foreach(DirectoryInfo.GetDirectories((“**”,SearchOption.AllDirectories)中的DirectoryInfo子目录yinfo)
{
//逻辑
添加(子目录yinfo.FullName);
}
返回所有文件夹;
}
关于访问权限,您可能无法访问每个文件夹的末尾,但我认为在某些特殊文件夹中会发生这种情况,您必须以某种方式自行处理这些问题。否则,这种方法可以正常工作


另外,请参见:

我没有运行此代码,但您必须递归地遍历文件夹。除了“捕获并继续”之外,我没有添加任何异常处理

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;
        }
private List GetAllFolders()
{
var allFolders=新列表();
返回GetAllFolders(this.sourceFolder);
}
//递归列出所有文件夹,捕获并在出现错误时继续
私有列表GetAllFolders(字符串文件夹)
{
DirectoryInfo DirectoryInfo=新的DirectoryInfo(文件夹);
List allFolders=新列表();
foreach(DirectoryInfo.GetDirectories()中的DirectoryInfo子目录yinfo)
{
//逻辑
试一试{
添加(子目录yinfo.FullName);
AddRange(GetAllFolders(子目录yinfo.FullName));
}
捕获(异常扩展)
{
//日志错误
Debug.WriteLine(“异常为”+
子目录yinfo.FullName+“:”+
exp.Message);
} 
}
返回所有文件夹;
}

我没有运行此代码,但您必须递归地遍历文件夹。除了“捕获并继续”之外,我没有添加任何异常处理

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;
        }
private List GetAllFolders()
{
var allFolders=新列表();
返回GetAllFolders(this.sourceFolder);
}
//递归列出所有文件夹,捕获并在出现错误时继续
私有列表GetAllFolders(字符串文件夹)
{
DirectoryInfo DirectoryInfo=新的DirectoryInfo(文件夹);
List allFolders=新列表();
foreach(DirectoryInfo.GetDirectories()中的DirectoryInfo子目录yinfo)
{
//逻辑
试一试{
添加(子目录yinfo.FullName);
AddRange(GetAllFolders(子目录yinfo.FullName));
}
捕获(异常扩展)
{
//日志错误
Debug.WriteLine(“异常为”+
子目录yinfo.FullName+“:”+
exp.Message);
} 
}
返回所有文件夹;
}
public void GetFolderList()
{
var list=新列表();
var root=newdirectoryinfo(“c:\\”);
GetFoldersRecursive(根目录,列表);
}
私有静态void GetFoldersRecursive(目录信息根目录,列表)
{
目录信息[]儿童;
尝试
{
list.Add(root.FullName);
children=root.GetDirectories();
}
捕获(未经授权的访问例外)
{
//拒绝访问
回来
}
foreach(儿童中的变量d)
GetFoldersRecursive(d,列表);
}
如果您喜欢使用更复杂的权限检查(而不是捕获异常),我建议您查看一下 { var list=新列表(); var root=newdirectoryinfo(“c:\\”); GetFoldersRecursive(根目录,列表); } 私有静态void GetFoldersRecursive(目录信息根目录,列表) { 目录信息[]儿童; 尝试 { list.Add(root.FullName); children=root.GetDirectories(); } 捕获(未经授权的访问例外) { //拒绝访问 回来 } foreach(儿童中的变量d) GetFoldersRecursive(d,列表); }
如果您喜欢使用更复杂的权限检查(而不是捕获异常),我建议您查看一下

谢谢,但是我如何使用t处理访问权限