Как определить, соответствует ли путь к удаленному файлу одному фильтру - PullRequest
0 голосов
/ 25 мая 2018

В настоящее время я получил эти пути в удаленной папке.

/folder 1/subfolder 2/filea.jpg

/folder 1/subfolder 2/fileb.pdf

/folder 1/subfolder 3/filea.jpg

И я установил фильтры, чтобы решить, следует ли мне загружать файл в списке путей на основе проводника Windows, например:

/folder ?/subfolder ?/*.jpg

/*/*/abc.*

/*/*/*.*

Каков наилучший способ принять решение, загрузить его или нет?

Спасибо

1 Ответ

0 голосов
/ 25 мая 2018

Один из способов сделать это - использовать комбинацию методов Directory.EnumerateDirectories() и Directory.GetFiles(), каждый из которых принимает аргумент string searchPattern.

Примечание. Чтобы использовать класс Directory, необходимо использовать пространство имен System.IO в верхней части файла:

using System.IO;

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

Например, у вас может быть метод, который принимает rootPath (самый верхний каталог, в котором вы ищете) и возвращает все файлы "* .jpg", которые находятся в каталоге с именем "подпапка?"(где ? является заполнителем для одного символа), только если подпапка находится непосредственно в каталоге с именем «folder?»:

/// <summary>
/// Searches for files using the pattern "/folder ?/subfolder ?/*.jpg"
/// </summary>
/// <param name="rootPath">The directory in which to begin the search</param>
/// <returns>A list of file paths that meet the criteria</returns>
public static List<string> GetDownloadableFiles(string rootPath)
{
    var files = new List<string>();

    // First find all the directories that match 'folder ?', anywhere under 'rootPath'
    foreach (var directory in Directory.EnumerateDirectories(rootPath, "folder ?", 
        SearchOption.AllDirectories))
    {
        // Now find all directories directly under 'folder ?' named 'subfolder ?'
        foreach (var subDir in Directory.EnumerateDirectories(directory, "subfolder ?"))
        {
            // And add the file path for all '*.jpg' files to our list
            files.AddRange(Directory.GetFiles(subDir, "*.jpg"));
        }
    }

    return files;
}

При использовании вы должны сделать что-то вроде:

List<string> downloadableFiles = GetDownloadableFiles(@"\\server\share");

Завершив этот метод, который обращается к вашему конкретному примеру, мы теперь можем видеть, как мы можем сделать это более универсальным, чтобы клиент мог передавать любую строку поиска.

Еслимы говорим, что символ разделителя в нашей строке поиска является косой чертой (/), тогда мы можем позволить пользователю передать строку и разделить ее на этот символ.Это даст нам массив шаблонов поиска по каталогу и шаблон поиска по файлу (последний элемент).

Как только мы это сделаем, мы можем циклически перебирать шаблоны поиска, получая каталоги, которые соответствуют текущему шаблону, и сохраняя их.во временном списке на каждой итерации, пока не дойдем до последней части (которая является шаблоном поиска файлов), где мы получим файлы, соответствующие этому шаблону.

Например:

/// <summary>
/// Searches for files using the pattern defined in 'searchPattern'
/// Example search patterns: "/project ?/photoshoot ?/flowers ?/*.jpg"
///                          "/project ?/plans ?/*.pdf"
///                          "/project ?/*.txt"
/// </summary>
/// <param name="rootPath">The directory in which to begin the search</param>
/// <param name="searchPattern">The directory and file search pattern</param>
/// <returns>A list of file paths that meet the criteria</returns>
public static List<string> GetDownloadableFiles(string rootPath, string searchPattern)
{
    if (!Directory.Exists(rootPath)) 
        throw new DirectoryNotFoundException(nameof(rootPath));
    if (searchPattern == null) 
        throw new ArgumentNullException(nameof(searchPattern));

    var files = new List<string>();
    var searchParts = searchPattern.Split(new[] {'/'}, 
        StringSplitOptions.RemoveEmptyEntries);

    // This will hold the list of directories to search, and 
    // will be updated on each iteration of our loop below. 
    // We start with just one item: the 'rootPath'
    var searchFolders = new List<string> {rootPath};

    for (int i = 0; i < searchParts.Length; i++)
    {
        var subFolders = new List<string>();

        foreach (var searchFolder in searchFolders)
        {
            // If we're at the last item, it's the file pattern, so add files
            if (i == searchParts.Length - 1)
            {
                files.AddRange(Directory.GetFiles(searchFolder, searchParts[i]));
            }
            // Otherwise, add the sub directories for this pattern
            else
            {
                subFolders.AddRange(Directory.GetDirectories(searchFolder, 
                    searchParts[i]));
            }
        }

        // Reset our search folders to use the list from the latest pattern
        searchFolders = subFolders;
    }

    return files;
}

Пример использования:

var files = GetDownloadableFiles(@"\\server\share", "/folder ?/subfolder ?/*.jpg");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...