Jas*_*n Z 338 .net c# filesystems
我正在尝试使用该Directory.GetFiles()方法来检索多种类型的文件列表,例如mp3's和jpg's.我试过以下两个都没有运气:
Directory.GetFiles("C:\\path", "*.mp3|*.jpg", SearchOption.AllDirectories);
Directory.GetFiles("C:\\path", "*.mp3;*.jpg", SearchOption.AllDirectories);
Run Code Online (Sandbox Code Playgroud)
有没有办法在一个电话中执行此操作?
Chr*_*tte 493
对于.NET 4.0及更高版本,
var files = Directory.EnumerateFiles("C:\\path", "*.*", SearchOption.AllDirectories)
.Where(s => s.EndsWith(".mp3") || s.EndsWith(".jpg"));
Run Code Online (Sandbox Code Playgroud)
对于早期版本的.NET,
var files = Directory.GetFiles("C:\\path", "*.*", SearchOption.AllDirectories)
.Where(s => s.EndsWith(".mp3") || s.EndsWith(".jpg"));
Run Code Online (Sandbox Code Playgroud)
编辑: 请阅读评论.Paul Farry建议的改进以及Christian.K指出的内存/性能问题都非常重要.
Alb*_*ert 58
这个怎么样:
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();
}
Run Code Online (Sandbox Code Playgroud)
我在这里找到了它(在评论中):http://msdn.microsoft.com/en-us/library/wz42302f.aspx
jno*_*iga 32
如果要检查大量扩展名,可以使用以下内容.我不想创建很多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
}
Run Code Online (Sandbox Code Playgroud)
drz*_*aus 29
对于
var exts = new[] { "mp3", "jpg" };
Run Code Online (Sandbox Code Playgroud)
你可以:
public IEnumerable<string> FilterFiles(string path, params string[] exts) {
return
Directory
.EnumerateFiles(path, "*.*")
.Where(file => exts.Any(x => file.EndsWith(x, StringComparison.OrdinalIgnoreCase)));
}
Run Code Online (Sandbox Code Playgroud)
Directory.EnumerateFiles以提高性能(Directory.EnumerateFiles与Directory.GetFiles有什么区别?).EndsWith("aspx", StringComparison.OrdinalIgnoreCase)而不是.ToLower().EndsWith("aspx"))但是,EnumerateFiles当您拆分过滤器并合并结果时,会显示真正的好处:
public IEnumerable<string> FilterFiles(string path, params string[] exts) {
return
exts.Select(x => "*." + x) // turn into globs
.SelectMany(x =>
Directory.EnumerateFiles(path, x)
);
}
Run Code Online (Sandbox Code Playgroud)
如果你不必将它们变成globs(即exts = new[] {"*.mp3", "*.jpg"}已经),它会变得更快.
基于以下LinqPad测试的性能评估(注意:Perf只重复代理10000次)
https://gist.github.com/zaus/7454021
(转发并从'复制'扩展,因为该问题特别请求没有LINQ:System.IO.Directory.GetFiles的多个文件扩展名searchPattern)
小智 16
我知道这是老问题,但LINQ :( .NET40 +)
var files = Directory.GetFiles("path_to_files").Where(file => Regex.IsMatch(file, @"^.+\.(wav|mp3|txt)$"));
Run Code Online (Sandbox Code Playgroud)
Dav*_*ael 11
另一种使用Linq的方法,但无需返回所有内容并在内存中过滤掉.
var files = Directory.GetFiles("C:\\path", "*.mp3", SearchOption.AllDirectories).Union(Directory.GetFiles("C:\\path", "*.jpg", SearchOption.AllDirectories));
Run Code Online (Sandbox Code Playgroud)
它实际上是2个调用GetFiles(),但我认为它与问题的精神一致,并将它们归还给一个可枚举的.
小智 11
还有一个下降解决方案似乎没有任何内存或性能开销,并且非常优雅:
string[] filters = new[]{"*.jpg", "*.png", "*.gif"};
string[] filePaths = filters.SelectMany(f => Directory.GetFiles(basePath, f)).ToArray();
Run Code Online (Sandbox Code Playgroud)
不.请尝试以下方法:
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 )
{
...;
}
Run Code Online (Sandbox Code Playgroud)
摘自:http://blogs.msdn.com/markda/archive/2006/04/20/580075.aspx
让
var set = new HashSet<string> { ".mp3", ".jpg" };
Run Code Online (Sandbox Code Playgroud)
然后
Directory.GetFiles(path, "*.*", SearchOption.AllDirectories)
.Where(f => set.Contains(
new FileInfo(f).Extension,
StringComparer.OrdinalIgnoreCase));
Run Code Online (Sandbox Code Playgroud)
要么
from file in Directory.GetFiles(path, "*.*", SearchOption.AllDirectories)
from ext in set
where String.Equals(ext, new FileInfo(file).Extension, StringComparison.OrdinalIgnoreCase)
select file;
Run Code Online (Sandbox Code Playgroud)
小智 5
List<string> FileList = new List<string>();
DirectoryInfo di = new DirectoryInfo("C:\\DirName");
IEnumerable<FileInfo> fileList = di.GetFiles("*.*");
//Create the query
IEnumerable<FileInfo> fileQuery = from file in fileList
where (file.Extension.ToLower() == ".jpg" || file.Extension.ToLower() == ".png")
orderby file.LastWriteTime
select file;
foreach (System.IO.FileInfo fi in fileQuery)
{
fi.Attributes = FileAttributes.Normal;
FileList.Add(fi.FullName);
}
Run Code Online (Sandbox Code Playgroud)
我不能使用.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);
}
}
Run Code Online (Sandbox Code Playgroud)
小智 5
DirectoryInfo directory = new DirectoryInfo(Server.MapPath("~/Contents/"));
//Using Union
FileInfo[] files = directory.GetFiles("*.xlsx")
.Union(directory
.GetFiles("*.csv"))
.ToArray();
Run Code Online (Sandbox Code Playgroud)
在 .NET 2.0 中(无 Linq):
public static List<string> GetFilez(string path, System.IO.SearchOption opt, params string[] patterns)
{
List<string> filez = new List<string>();
foreach (string pattern in patterns)
{
filez.AddRange(
System.IO.Directory.GetFiles(path, pattern, opt)
);
}
// filez.Sort(); // Optional
return filez; // Optional: .ToArray()
}
Run Code Online (Sandbox Code Playgroud)
然后使用它:
foreach (string fn in GetFilez(path
, System.IO.SearchOption.AllDirectories
, "*.xml", "*.xml.rels", "*.rels"))
{}
Run Code Online (Sandbox Code Playgroud)
如果您使用 VB.NET(或将依赖项导入到 C# 项目中),实际上存在一种方便的方法,可以过滤多个扩展:
Microsoft.VisualBasic.FileIO.FileSystem.GetFiles("C:\\path", Microsoft.VisualBasic.FileIO.SearchOption.SearchAllSubDirectories, new string[] {"*.mp3", "*.jpg"});
Run Code Online (Sandbox Code Playgroud)
在 VB.NET 中,可以通过 My-namespace 访问它:
My.Computer.FileSystem.GetFiles("C:\path", FileIO.SearchOption.SearchAllSubDirectories, {"*.mp3", "*.jpg"})
Run Code Online (Sandbox Code Playgroud)
不幸的是,这些方便的方法不支持像这样的延迟评估变体Directory.EnumerateFiles()。