我正在嘗試使用Directory.GetFiles()
方法來檢索多種類型的文件列表,例如mp3
和jpg
。 我沒有運氣就嘗試瞭如下兩種方法: 編程
Directory.GetFiles("C:\\path", "*.mp3|*.jpg", SearchOption.AllDirectories); Directory.GetFiles("C:\\path", "*.mp3;*.jpg", SearchOption.AllDirectories);
有沒有辦法在一個電話中作到這一點? 函數
我知道這是一個老問題,可是LINQ:(.NET40 +) 性能
var files = Directory.GetFiles("path_to_files").Where(file => Regex.IsMatch(file, @"^.+\.(wav|mp3|txt)$"));
我遇到了一樣的問題,沒法找到正確的解決方案,因此我編寫了一個名爲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");
還有一個降低的解決方案,彷佛沒有任何內存或性能開銷,並且很是優雅: string
string[] filters = new[]{"*.jpg", "*.png", "*.gif"}; string[] filePaths = filters.SelectMany(f => Directory.GetFiles(basePath, f)).ToArray();
我不知道爲何發佈了這麼多「解決方案」? it
若是我對GetFiles如何工做的新手理解是正確的,那麼只有兩種選擇,而且上述任何解決方案均可以歸結爲如下兩種:
GetFiles,而後進行過濾:速度很快,可是因爲存儲開銷直到應用了過濾器後,它才成爲內存殺手
GetFiles時過濾:設置的過濾器越慢,但因爲沒有存儲開銷,內存使用率低。
這在上面的一篇文章中以使人印象深入的基準進行了說明:每一個過濾器選項都會致使單獨的GetFile操做,所以硬盤的同一部分將被讀取屢次。
我認爲選項1)更好,可是在C:\\等文件夾上使用SearchOption.AllDirectories會佔用大量內存。
所以,我只會使用選項1來制定一個遍歷全部子文件夾的遞歸子方法
這應該在每一個文件夾上僅致使1個GetFiles操做,所以速度較快(選項1),可是僅使用少許內存,由於在每一個子文件夾的讀取以後應用過濾器->在每一個子文件夾後刪除開銷。
若是我錯了,請糾正我。 就像我說的那樣,我對編程很陌生,可是想對事物有更深刻的瞭解,最終擅長於此:)
DirectoryInfo directory = new DirectoryInfo(Server.MapPath("~/Contents/")); //Using Union FileInfo[] files = directory.GetFiles("*.xlsx") .Union(directory .GetFiles("*.csv")) .ToArray();