我试图使用Directory.GetFiles()方法检索多种类型的文件列表,如mp3的和jpg的。以下两种方法我都试过了,但都没有成功:
Directory.GetFiles("C:\\path", "*.mp3|*.jpg", SearchOption.AllDirectories);
Directory.GetFiles("C:\\path", "*.mp3;*.jpg", SearchOption.AllDirectories);
有没有办法一次就能搞定?
我试图使用Directory.GetFiles()方法检索多种类型的文件列表,如mp3的和jpg的。以下两种方法我都试过了,但都没有成功:
Directory.GetFiles("C:\\path", "*.mp3|*.jpg", SearchOption.AllDirectories);
Directory.GetFiles("C:\\path", "*.mp3;*.jpg", SearchOption.AllDirectories);
有没有办法一次就能搞定?
当前回答
我想知道为什么有这么多“解决方案”张贴?
如果我对GetFiles如何工作的新手理解是正确的,那么只有两个选项,上面的任何解决方案都可以归结为:
GetFiles,然后是filter:速度很快,但在应用过滤器之前,由于存储开销,是内存杀手 在GetFiles时过滤:设置的过滤器越多,速度越慢,但由于没有存储开销,内存使用量就越低。这在上面的一篇文章中有一个令人印象深刻的基准测试:每个过滤器选项都会导致一个单独的GetFile-operation,因此硬盘的同一部分会被读取几次。
在我看来,选项1)是更好的,但使用SearchOption。像C:\这样的文件夹中的所有目录会占用大量内存。 因此,我将创建一个递归子方法,使用选项1遍历所有子文件夹)
这应该导致每个文件夹上只有1个getfiles -操作,因此速度很快(选项1),但只使用少量内存,因为在每个子文件夹读取后应用过滤器->开销在每个子文件夹后删除。
如果我说错了,请指正。就像我说的,我对编程很陌生,但我想对事情有更深入的了解,最终在这方面做得很好:)
其他回答
我想知道为什么有这么多“解决方案”张贴?
如果我对GetFiles如何工作的新手理解是正确的,那么只有两个选项,上面的任何解决方案都可以归结为:
GetFiles,然后是filter:速度很快,但在应用过滤器之前,由于存储开销,是内存杀手 在GetFiles时过滤:设置的过滤器越多,速度越慢,但由于没有存储开销,内存使用量就越低。这在上面的一篇文章中有一个令人印象深刻的基准测试:每个过滤器选项都会导致一个单独的GetFile-operation,因此硬盘的同一部分会被读取几次。
在我看来,选项1)是更好的,但使用SearchOption。像C:\这样的文件夹中的所有目录会占用大量内存。 因此,我将创建一个递归子方法,使用选项1遍历所有子文件夹)
这应该导致每个文件夹上只有1个getfiles -操作,因此速度很快(选项1),但只使用少量内存,因为在每个子文件夹读取后应用过滤器->开销在每个子文件夹后删除。
如果我说错了,请指正。就像我说的,我对编程很陌生,但我想对事情有更深入的了解,最终在这方面做得很好:)
没有。试试下面的方法:
List<string> _searchPatternList = new List<string>();
...
List<string> fileList = new List<string>();
foreach ( string ext in _searchPatternList )
{
foreach ( string subFile in Directory.GetFiles( folderName, ext )
{
fileList.Add( subFile );
}
}
// Sort alpabetically
fileList.Sort();
// Add files to the file browser control
foreach ( string fileName in fileList )
{
...;
}
摘自:http://blogs.msdn.com/markda/archive/2006/04/20/580075.aspx
是什么
string[] filesPNG = Directory.GetFiles(path, "*.png");
string[] filesJPG = Directory.GetFiles(path, "*.jpg");
string[] filesJPEG = Directory.GetFiles(path, "*.jpeg");
int totalArraySizeAll = filesPNG.Length + filesJPG.Length + filesJPEG.Length;
List<string> filesAll = new List<string>(totalArraySizeAll);
filesAll.AddRange(filesPNG);
filesAll.AddRange(filesJPG);
filesAll.AddRange(filesJPEG);
我不能使用. where方法,因为我在. net Framework 2.0中编程(Linq只在. net Framework 3.5+中被支持)。
下面的代码不区分大小写(因此.cab或.cab也会被列出)。
string[] ext = new string[2] { "*.CAB", "*.MSU" };
foreach (string found in ext)
{
string[] extracted = Directory.GetFiles("C:\\test", found, System.IO.SearchOption.AllDirectories);
foreach (string file in extracted)
{
Console.WriteLine(file);
}
}
您可以将此添加到项目中
public static class Collectables {
public static List<System.IO.FileInfo> FilesViaPattern(this System.IO.DirectoryInfo fldr, string pattern) {
var filter = pattern.Split(" ");
return fldr.GetFiles( "*.*", System.IO.SearchOption.AllDirectories)
.Where(l => filter.Any(k => l.Name.EndsWith(k))).ToList();
}
}
然后像这样在任何地方使用它
new System.IO.DirectoryInfo("c:\\test").FilesViaPattern("txt doc any.extension");