Как можно рекурсивно искать каталоги с несколькими подстановочными знаками?

Используя C # (.NET), как я могу выполнить поиск в файловой системе по маске поиска в каталоге, например: (?)

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

Например, мне нужно сначала найти все каталоги верхнего уровня:

\\server\Scanner\images\Job1Images
\\server\Scanner\images\Job2Images

... тогда мне нужно продолжить с маской поиска:

\\server\Scanner\images\Job1Images\*\*_*
\\server\Scanner\images\Job2Images\*\*_*

Это нене кажется слишком сложным, но я не могуне понять это для жизни меня ...

Как уже упоминалось выше, ям с использованием C # и .NET. Поиск может пытаться найти каталоги или файлы. (т.е. * .txt или <* Directory>)

 Mario21 нояб. 2012 г., 19:40
Если я не понял, что вы искали, нет мой ответ даст вам именно то, что вы хотите? Если нет, то почему? Что вы ищете?т совершенно ясно
 SofaKng20 нояб. 2012 г., 18:25
Извини я'ищу то, что подходит под всю маску. Например, "\\ сервер \ сканер \ образы \ Job1Images \ file.txt» Wouldn»не работает, но это не такподходит для всей маски. Только что то типа\\ сервер \ сканер \ образы \ Job1Images \ Folder2 \ MyFile_File.txt» должно сработать. Имеет ли это смысл?
 tsells20 нояб. 2012 г., 17:57
Поэтому мне не ясно, какие у вас подстановочные знаки - вы ищете конкретный файл или каталог с подчеркиванием в имени (на основе вашего примера)?
 Panos Rontogiannis20 нояб. 2012 г., 21:29
Вам нужны только файлы, найденные в подпапках работыПапки изображений? Вы не хотите файлы в работеПапки изображений тоже?
 paparazzo20 нояб. 2012 г., 20:43
Я не получаю рекурсивную часть. Вы хотите сопоставить \\ server \ Scanner \ images \ recursive \ Job1Images ** _ *?

Ответы на вопрос(3)

редактировать: Ах, новая функциональность с .NET 4, так что вы ненужно сделать рекурсивную функцию (спасибо Мэтью Брубейкер)

IEnumerable<string> \some folder to start in", filePatternToMatchOn, System.IO.SearchOption.AllDirectories);
</string>







Первый ответ:

//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);
</string></string>

...

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);
    }
}
</string>
    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;
            }
        }
    }
}
</string>

*Образ" каталог перечислены.

Наконец, вы можете использовать его с:

foreach (var path in GetImages())
            {
                Console.WriteLine(path);
            }
 Panos Rontogiannis20 нояб. 2012 г., 20:49
@ MatthewBrubaker Вы правы! Благодарю. Буду обновлять мой ответ.
 Panos Rontogiannis20 нояб. 2012 г., 21:24
@SofaKng Он будет пытаться сопоставить регулярное выражение для любого файла, найденного под вашим "изображений" папка. Если вы ожидаете определенный формат изображения, вы можете заменить. с позволюs говорят * .jpg и перечисляют только изображения JPG.
 Matthew Brubaker20 нояб. 2012 г., 20:12
Пожалуйста, поощряйте использованиеmsdn.microsoft.com/en-us/library/... поскольку он гораздо эффективнее и не заполняет список, пока это не будет необходимо.
 SofaKng20 нояб. 2012 г., 21:03
Это выглядит отлично, но выигралt сначала получить список каждого файла в файловой системе, а затем выполнить сопоставление с регулярным выражением? Я думаю, что это будет очень медленно, если естьверхний уровень" каталоги, которые нене соответствует регулярному выражению, но потому что это соответствует каждому файлу в системе. (см. мой OP пример того, что яречь идет о фильтрации каталогов по мере углубления и т. д.)

Каталоги высшего уровня:

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

И тогда вам нужно будет выполнить функцию восстановления этих папок, используя шаблон подстановки, например:

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

Я предлагаю вам поиграть с подстановочными знаками, чтобы получить вывод массива, и вы поймете, какой из них лучше всего, если использовать рекурсивную функцию или напрямую запрашивать пути.

Ваш ответ на вопрос