您可使用多個過濾器調用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();
相關文章
相關標籤/搜索