我正在尝试使用Directory.GetFiles()
方法来检索多种类型的文件列表,例如mp3
和jpg
。 我没有运气就尝试了以下两种方法:
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如何工作的新手理解是正确的,那么只有两种选择,并且上述任何解决方案都可以归结为以下两种:
GetFiles,然后进行过滤:速度很快,但是由于存储开销直到应用了过滤器后,它才成为内存杀手
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();
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3189201