我正在尝试使用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();