給定一個文件目錄(作爲FileInfo數組),我將如何去提取所有具有相應文件名和特定擴展名的文件名。linq提取特定的子集
例如,給定以下文件的目錄;
file1.txt
file1.txt.xml
file2.txt
file2.txt.xml
file3.xml
file3.xml.xml
我該如何提取file1.txt,file2.txt和file3.xml。基本上,我正在尋找任何有我的給定擴展名(本例中爲xml)的對應條目的文件。
在此先感謝。
給定一個文件目錄(作爲FileInfo數組),我將如何去提取所有具有相應文件名和特定擴展名的文件名。linq提取特定的子集
例如,給定以下文件的目錄;
file1.txt
file1.txt.xml
file2.txt
file2.txt.xml
file3.xml
file3.xml.xml
我該如何提取file1.txt,file2.txt和file3.xml。基本上,我正在尋找任何有我的給定擴展名(本例中爲xml)的對應條目的文件。
在此先感謝。
此代碼將產生相應文件的列表(假設文件是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();
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
}
謝謝詹姆斯。我可以得到這一點,但是,我正在尋找更有活力的東西。例如,基本上,我需要每個文件名都有一個匹配的文件名和我的擴展名(在這種情況下恰好是xml)。 –
詹姆斯的解決方案工作。您還可以使用
files.Where(fi => fi.Extension == ext).ToList();
D'oh!我檢查了(sorta),但沒有找到擴展屬性(我只是查看了幫助查看器內容面板中列出的FileInfo特定屬性,我不認爲擴展屬性可能是從基類繼承的) –
你可以用的東西去像
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);
我更喜歡這個。這更接近我所需要的。事情是,我不確切知道主要文件集的擴展名。我只能知道,如果有兩個文件具有相同的名稱,另一個具有我的擴展名,那麼這就是我感興趣的文件。我在使用Enumerable.Contains方法來查找文件file.Name.Contains( file.Name +「myknownextension」),但我不確定是否可以創建一些匿名比較器或其他東西,或者如果我必須爲此創建一個新的比較器類。 –
@Mr Moose,你可以省略'mainExtension'部分,並簡單地在'var mainFiles = ...'行中使用單個變量'path'重載。代碼應該仍然在邏輯上工作。我已更新。 –
+1不區分大小寫比較 –
這是一種享受。謝謝。我幾乎在那裏,但我不能完全解決它。再次感謝。 –