您可以使用多个过滤器调用Directory.GetFiles()吗?

好久不见. 提交于 2020-03-06 18:52:37

我正在尝试使用Directory.GetFiles()方法来检索多种类型的文件列表,例如mp3jpg 。 我没有运气就尝试了以下两种方法:

Directory.GetFiles("C:\\path", "*.mp3|*.jpg", SearchOption.AllDirectories);
Directory.GetFiles("C:\\path", "*.mp3;*.jpg", SearchOption.AllDirectories);

有没有办法在一个电话中做到这一点?


#1楼

我知道这是一个老问题,但是LINQ:(.NET40 +)

var files = Directory.GetFiles("path_to_files").Where(file => Regex.IsMatch(file, @"^.+\.(wav|mp3|txt)$"));

#2楼

我遇到了同样的问题,无法找到正确的解决方案,所以我编写了一个名为GetFiles的函数:

/// <summary>
/// Get all files with a specific extension
/// </summary>
/// <param name="extensionsToCompare">string list of all the extensions</param>
/// <param name="Location">string of the location</param>
/// <returns>array of all the files with the specific extensions</returns>
public string[] GetFiles(List<string> extensionsToCompare, string Location)
{
    List<string> files = new List<string>();
    foreach (string file in Directory.GetFiles(Location))
    {
        if (extensionsToCompare.Contains(file.Substring(file.IndexOf('.')+1).ToLower())) files.Add(file);
    }
    files.Sort();
    return files.ToArray();
}

此函数将仅调用Directory.Getfiles()

例如,调用如下函数:

string[] images = GetFiles(new List<string>{"jpg", "png", "gif"}, "imageFolder");

编辑:要获取具有多个扩展名的文件,请使用此文件:

/// <summary>
    /// Get the file with a specific name and extension
    /// </summary>
    /// <param name="filename">the name of the file to find</param>
    /// <param name="extensionsToCompare">string list of all the extensions</param>
    /// <param name="Location">string of the location</param>
    /// <returns>file with the requested filename</returns>
    public string GetFile( string filename, List<string> extensionsToCompare, string Location)
    {
        foreach (string file in Directory.GetFiles(Location))
        {
            if (extensionsToCompare.Contains(file.Substring(file.IndexOf('.') + 1).ToLower()) &&& file.Substring(Location.Length + 1, (file.IndexOf('.') - (Location.Length + 1))).ToLower() == filename) 
                return file;
        }
        return "";
    }

例如,调用如下函数:

string image = GetFile("imagename", new List<string>{"jpg", "png", "gif"}, "imageFolder");

#3楼

还有一个下降的解决方案,似乎没有任何内存或性能开销,而且非常优雅:

string[] filters = new[]{"*.jpg", "*.png", "*.gif"};
string[] filePaths = filters.SelectMany(f => Directory.GetFiles(basePath, f)).ToArray();

#4楼

我不知道为什么发布了这么多“解决方案”?

如果我对GetFiles如何工作的新手理解是正确的,那么只有两种选择,并且上述任何解决方案都可以归结为以下两种:

  1. GetFiles,然后进行过滤:速度很快,但是由于存储开销直到应用了过滤器后,它才成为内存杀手

  2. GetFiles时过滤:设置的过滤器越慢,但由于没有存储开销,内存使用率低。
    这在上面的一篇文章中以令人印象深刻的基准进行了说明:每个过滤器选项都会导致单独的GetFile操作,因此硬盘的同一部分将被读取多次。

我认为选项1)更好,但是在C:\\等文件夹上使用SearchOption.AllDirectories会占用大量内存。
因此,我只会使用选项1来制定一个遍历所有子文件夹的递归子方法

这应该在每个文件夹上仅导致1个GetFiles操作,因此速度较快(选项1),但是仅使用少量内存,因为在每个子文件夹的读取之后应用过滤器->在每个子文件夹后删除开销。

如果我错了,请纠正我。 就像我说的那样,我对编程很陌生,但是想对事物有更深入的了解,最终擅长于此:)


#5楼

DirectoryInfo directory = new DirectoryInfo(Server.MapPath("~/Contents/"));

//Using Union

FileInfo[] files = directory.GetFiles("*.xlsx")
                            .Union(directory
                            .GetFiles("*.csv"))
                            .ToArray();
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!