如何判断远程文件路径是否对应于一个过滤器

时间:2018-05-24 23:34:15

标签: c# windows file filter explorer

目前,我已在远程文件夹中获取这些路径。

/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 :(得分:1)

执行此操作的一种方法是使用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");