给定一个文件目录(作为FileInfo数组),我将如何提取具有特定扩展名的相应文件名的所有文件名。
例如,给定以下文件的目录;
file1.txt
file1.txt.xml
file2.txt
file2.txt.xml
file3.xml
file3.xml.xml
如何提取file1.txt,file2.txt和file3.xml。基本上,我正在寻找任何具有我的给定扩展名的对应条目的文件(在这种情况下为xml)。
提前致谢。
答案 0 :(得分:2)
此代码将生成相应文件的列表(假设文件为IEnumerable<FileInfo>
:
var ext = ".xml"; // To match your example above
var list = files.Where(f => f.Extension.Equals(ext, StringComparison.OrdinalIgnoreCase))
.Select( f => Path.Combine(f.DirectoryName, Path.GetFileNameWithoutExtension(f.Name)))
.Where( n => File.Exists(n))
.ToList();
答案 1 :(得分:1)
詹姆斯的解决方案有效。您也可以使用
files.Where(fi => fi.Extension == ext).ToList();
答案 2 :(得分:1)
你可以选择像
这样的东西string path = @"C:\Temp\XYZ";
string mainExtension = ".txt"; // optionally use
string companionExtension = ".xml";
var mainFiles = Directory.GetFiles(path); // or (path, "*" + mainExtension);
var companionFiles = Directory.GetFiles(path, "*" + companionExtension);
var filesWithCompanions = from file in mainFiles
from companion in companionFiles
where companion == file + companionExtension
select file;
如果目录相当大,那么下面的内容可能会更加优化
var companionQuery = companionFiles.Select(file => file.Replace(Path.GetExtension(file), ""));
var companionSet = new HashSet<string>(companionQuery);
var filesWithCompanions = mainFiles.Where(companionSet.Contains);
答案 3 :(得分:0)
var ext = ".xml";
FileInfo[] files = ...
var filered = files.Where(fi=> fi.Name.EndsWith(ext)).ToList();
// filtered is an List<FileInfo>
但是,您可能不需要ToList()(或过滤器变量)
var ext = ".xml";
FileInfo[] files = ...
foreach(var file in files.Where(fi=> fi.Name.EndsWith(ext))
{
// do something with "file" here
}