How can recursively search directories with multiple wildcards?

前端 未结 3 608
栀梦
栀梦 2021-01-22 00:12

Using C# (.NET), how can I search a file system given a directory search mask like this: (?)

\\\\server\\Scanner\\images\\*Images\\*\\*_*

For e

相关标签:
3条回答
  • 2021-01-22 00:34

    Like this:

    Top Level Directories:

      //get Top level
       string[] TopLevel = Directory.GetDirectories(path);
    

    And then you will have to do a resursive function of this folders using wildcard pattern, for example:

     // Only get subdirectories that begin with the letter "p." 
                string pattern = "p*";
                string[] dirs = folder.GetDirectories(path, pattern);
    

    I suggest you play with wildcards to get the array output and you will figure out which is the best way, if using resursive function or directly quering paths.

    0 讨论(0)
  • 2021-01-22 00:42

    Edit: Ahh, new functionality with .NET 4 so you don't have to do a recursive function (Thanks Matthew Brubaker)

    IEnumerable<String> matchingFilePaths2 = System.IO.Directory.EnumerateFiles(@"C:\some folder to start in", filePatternToMatchOn, System.IO.SearchOption.AllDirectories);
    




    First Answer:

    //get all files that have an underscore - searches all folders under the start folder
    List<String> matchingFilePaths = new List<string>();
    String filePatternToMatchOn = "*_*";
    FileUtilities.GetAllFilesMatchingPattern(@"C:\some folder to start in", ref matchingFilePaths, filePatternToMatchOn);
    

    ...

    public static void GetAllFilesMatchingPattern(String pathToGetFilesIn, ref List<String> fullFilePaths, String searchPattern)
    {
        //get all files in current directory that match the pattern
        String[] filePathsInCurrentDir = Directory.GetFiles(pathToGetFilesIn, searchPattern);
        foreach (String fullPath in filePathsInCurrentDir)
        {
            fullFilePaths.Add(fullPath);
        }
    
        //call this method recursively for all directories
        String[] directories = Directory.GetDirectories(pathToGetFilesIn);
        foreach (String path in directories)
        {
            GetAllFilesMatchingPattern(path, ref fullFilePaths, searchPattern);
        }
    }
    
    0 讨论(0)
  • 2021-01-22 00:56
        public static IEnumerable<string> GetImages()
    {    
        //For each "*Image" directory
        foreach (var jobFolder in Directory.EnumerateDirectories(@"\\server\Scanner\images", "*Images"))
        {
            //For each first level subdirectory
            foreach (var jobSubFolder in Directory.EnumerateDirectories(jobFolder))
            {
                //Enumerate each file containing a '_'
                foreach (var filePath in Directory.EnumerateFiles(jobSubFolder, "*_*", SearchOption.TopDirectoryOnly))
                {                               
                    yield return filePath;
                }
            }
        }
    }
    

    Only the files from the first level subdirectories of each "*Image" directory are enumerated.

    Finally you can use it with:

    foreach (var path in GetImages())
                {
                    Console.WriteLine(path);
                }
    
    0 讨论(0)
提交回复
热议问题