如何在D:\ myfolder \中使用C#获取命名为*的直接目录列表

时间:2018-07-22 19:07:18

标签: c# winforms directory

如何在** D:\ myfolder **中使用C#获取名为******的直接目录列表

我尝试过

        String root = @"E:\something-*";
        var directories = Directory.GetDirectories(root);

但实际上提供了错误信息,E:\的列表也将作为变量目录中的值。

enter image description here

我还尝试在stackoverflow和其他论坛上寻找可能的解决方案,但没有得到对我的查询的任何适当答案。

2 个答案:

答案 0 :(得分:0)

您需要获取具有搜索模式并准备正确模式以进行搜索的GetDirectories超载

String root = @"E:\something-*";
string parent = Path.GetDirectoryName(root);

// A little trick, here GetFilename will return "something-*"
string search = Path.GetFileName(root);
var dirs = Directory.GetDirectories(parent, search);

还有第三个重载,允许您在父文件夹下递归搜索模式

    var dirs = Directory.GetDirectories(parent, search, SearchOption.AllDirectories);

您遇到的问题是由于系统目录(例如系统卷信息)的存在而导致的,您没有权限在该目录上读取其内容。 MSDN提供了一个如何克服这种情况的示例,并且可以通过一些小的更改(例如下面的更改)来适应您的要求

// Call the WalkDirectoryTree with the parameters below
// Notice that I have removed the * in the search pattern    
var dirs = WalkDirectoryTree(@"E:\", @"something-");

List<string> WalkDirectoryTree(string root, string search)
{
    try
    {
        var  files = Directory.GetFiles(root, "*.*");
    }
    // This is thrown if even one of the files requires permissions greater
    // than the application provides.
    catch (UnauthorizedAccessException e)
    {
        // This code just writes out the message and continues to recurse.
        // You may decide to do something different here. For example, you
        // can try to elevate your privileges and access the file again.
        Console.WriteLine(e.Message);
        return new List<string>();
    }

    catch (System.IO.DirectoryNotFoundException e)
    {
        Console.WriteLine(e.Message);
        return new List<string>();
    }

    // Now find all the subdirectories under this directory.
    List<string> subDirs = new List<string>();
    List<string> curDirs = Directory.GetDirectories(root).ToList();
    foreach (string s in curDirs)
    {
        if(s.StartsWith(search))
            subDirs.Add(s);
        var result = WalkDirectoryTree(s, search);
        subDirs.AddRange(result);
    }
    return subDirs;
}

答案 1 :(得分:0)

这里是一个示例,它将编译与Path中存在的SearchPatn匹配的DirectoryInfo对象(目录)的数组。  因此,如果Path等于“ D:\ myfolders \”,SearchPatn等于“ something- *”,您将得到类似以下内容的结果:something-abc,something-xyz作为可以操作的文件夹。

使用searchOption的警告:AllDirectories将搜索路径下方的所有文件夹,并返回找到的所有内容。如果只希望从根目录访问文件夹,请使用TopDirectoryOnly searchOption。

    // this returns an array of folders based on the SearchPatn (i.e., the folders you're looking for)
    private DirectoryInfo[] getSourceFolders(string Path, string SearchPatn)
    {
        System.IO.DirectoryInfo[] f = new DirectoryInfo(Path).GetDirectories(SearchPatn, searchOption: SearchOption.AllDirectories);
        return f;
    }