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

我正在尝试使用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的函数: spa

/// <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()code

例如,调用以下函数: 递归

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 "";
    }

例如,调用以下函数: ci

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

#3楼

还有一个降低的解决方案,彷佛没有任何内存或性能开销,并且很是优雅: string

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

#4楼

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

若是我对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();
相关文章
相关标签/搜索