我正在尝试使用该Directory.GetFiles()
方法来检索多种类型的文件列表,例如mp3
's和jpg
's.我试过以下两个都没有运气:
Directory.GetFiles("C:\\path", "*.mp3|*.jpg", SearchOption.AllDirectories); Directory.GetFiles("C:\\path", "*.mp3;*.jpg", SearchOption.AllDirectories);
有没有办法在一个电话中执行此操作?
对于.NET 4.0及更高版本,
var files = Directory.EnumerateFiles("C:\\path", "*.*", SearchOption.AllDirectories) .Where(s => s.EndsWith(".mp3") || s.EndsWith(".jpg"));
对于早期版本的.NET,
var files = Directory.GetFiles("C:\\path", "*.*", SearchOption.AllDirectories) .Where(s => s.EndsWith(".mp3") || s.EndsWith(".jpg"));
编辑: 请阅读评论.Paul Farry建议的改进以及Christian.K指出的内存/性能问题都非常重要.
这个怎么样:
private static string[] GetFiles(string sourceFolder, string filters, System.IO.SearchOption searchOption) { return filters.Split('|').SelectMany(filter => System.IO.Directory.GetFiles(sourceFolder, filter, searchOption)).ToArray(); }
我在这里找到了它(在评论中):http://msdn.microsoft.com/en-us/library/wz42302f.aspx
如果要检查大量扩展名,可以使用以下内容.我不想创建很多OR语句,所以我修改了lette写的内容.
string supportedExtensions = "*.jpg,*.gif,*.png,*.bmp,*.jpe,*.jpeg,*.wmf,*.emf,*.xbm,*.ico,*.eps,*.tif,*.tiff,*.g01,*.g02,*.g03,*.g04,*.g05,*.g06,*.g07,*.g08"; foreach (string imageFile in Directory.GetFiles(_tempDirectory, "*.*", SearchOption.AllDirectories).Where(s => supportedExtensions.Contains(Path.GetExtension(s).ToLower()))) { //do work here }
对于
var exts = new[] { "mp3", "jpg" };
你可以:
public IEnumerableFilterFiles(string path, params string[] exts) { return Directory .EnumerateFiles(path, "*.*") .Where(file => exts.Any(x => file.EndsWith(x, StringComparison.OrdinalIgnoreCase))); }
不要忘记新的.NET4 Directory.EnumerateFiles
以提高性能(Directory.EnumerateFiles与Directory.GetFiles有什么区别?)
"IgnoreCase"应该比"ToLower"更快(.EndsWith("aspx", StringComparison.OrdinalIgnoreCase)
而不是.ToLower().EndsWith("aspx")
)
但是,EnumerateFiles
当您拆分过滤器并合并结果时,会显示真正的好处:
public IEnumerableFilterFiles(string path, params string[] exts) { return exts.Select(x => "*." + x) // turn into globs .SelectMany(x => Directory.EnumerateFiles(path, x) ); }
如果你不必将它们变成globs(即exts = new[] {"*.mp3", "*.jpg"}
已经),它会变得更快.
基于以下LinqPad测试的性能评估(注意:Perf
只重复代理10000次)
https://gist.github.com/zaus/7454021
(转发并从'复制'扩展,因为该问题特别请求没有LINQ:System.IO.Directory.GetFiles的多个文件扩展名searchPattern)
我知道这是老问题,但LINQ :( .NET40 +)
var files = Directory.GetFiles("path_to_files").Where(file => Regex.IsMatch(file, @"^.+\.(wav|mp3|txt)$"));
另一种使用Linq的方法,但无需返回所有内容并在内存中过滤掉.
var files = Directory.GetFiles("C:\\path", "*.mp3", SearchOption.AllDirectories).Union(Directory.GetFiles("C:\\path", "*.jpg", SearchOption.AllDirectories));
它实际上是2个调用GetFiles()
,但我认为它与问题的精神一致,并将它们归还给一个可枚举的.
还有一个下降解决方案似乎没有任何内存或性能开销,并且非常优雅:
string[] filters = new[]{"*.jpg", "*.png", "*.gif"}; string[] filePaths = filters.SelectMany(f => Directory.GetFiles(basePath, f)).ToArray();
不.请尝试以下方法:
List_searchPatternList = new List (); ... List fileList = new List (); 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
让
var set = new HashSet{ ".mp3", ".jpg" };
然后
Directory.GetFiles(path, "*.*", SearchOption.AllDirectories) .Where(f => set.Contains( new FileInfo(f).Extension, StringComparer.OrdinalIgnoreCase));
要么
from file in Directory.GetFiles(path, "*.*", SearchOption.AllDirectories) from ext in set where String.Equals(ext, new FileInfo(file).Extension, StringComparison.OrdinalIgnoreCase) select file;
我不能使用.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); } }