使用System.IO.Directory.GetFiles和路径中的通配符进行搜索

时间:2016-08-17 07:15:47

标签: c#

我在C#程序中遇到了一个奇怪的问题。 我有一些本地文件夹路径,如

"C:\test\AB_Systems\ELEGANCE\CB-DOC\live\M7-091.249.99.XX.01\extobjects".

现在我想在名为" extobjects"的子文件夹中搜索PDF文件。 不幸的是,文件夹" live"中有很多子文件夹,它有一个名为" extobjects"的子文件夹,所以我认为在搜索路径中使用通配符会更好:

"C:\test\AB_Systems\ELEGANCE\CB-DOC\live\*\extobjects"

但这不起作用。 有没有办法做到这一点?

3 个答案:

答案 0 :(得分:1)

    public static FileInfo[] findFile(String whereToSearch, String searchFor , String mode)
    {
        IEnumerable<FileInfo> files = null;
        if (mode.Equals(""))
            mode = "s";

        if (searchFor.Equals(""))
            searchFor = "*";

        if (mode.Equals("r") || mode.Equals("recursive"))
        {
            DirectoryInfo dir = new DirectoryInfo(whereToSearch);
            files = dir.EnumerateFiles(searchFor, searchOption: SearchOption.AllDirectories);
        }

        if (mode.Equals("s") || mode.Equals("specific"))
        {
            DirectoryInfo dir = new DirectoryInfo(whereToSearch);
            files = dir.EnumerateFiles(searchFor, searchOption: SearchOption.TopDirectoryOnly);
        }

        if (files != null) return files.ToArray<FileInfo>();
        else return null;
    }

这是一个如何做的例子。

重要的是,只有文件名可以包含像*这样的通配符模式。路径可以作为开始搜索的位置,并通过提供 searchOption:searchOption.AllDirectories 作为参数,它将遍历条目路径的所有子目录。

您将收到一个FileInfo数组,其中包含路径和更多信息的对象。

答案 1 :(得分:0)

您可以像这样使用Linq:

var files = Directory
    .EnumerateDirectories(@"C:\test\AB_Systems\ELEGANCE\CB-DOC\live", "extobjects", SearchOption.AllDirectories)
    .SelectMany(x => Directory.EnumerateFiles(x, "*pdf", SearchOption.TopDirectoryOnly))
    .ToArray();

答案 2 :(得分:0)

我选择的解决方案正是BugFinder所提出的,如果您的.NET目标支持,您可以将以下foreach-loop优化为LINQ查询。

        // Itterate subdirectories of the live folder
        foreach (var subDir in Directory.GetDirectories(@"C:\test\AB_Systems\ELEGANCE\CB-DOC\live"))
        {
            // Check if path to extobjects exists
            var extObjects = Path.Combine(subDir, "extobjects");
            if (Directory.Exists(extObjects))
            {
                var pdfFiles = Directory.GetFiles(extObjects, "*").Where(x=>x.EndsWith(".pdf"));
                // Do something with the pdf file paths
            }
        }