2011-08-25 44 views
1

給定一個文件目錄(作爲FileInfo數組),我將如何去提取所有具有相應文件名和特定擴展名的文件名。linq提取特定的子集

例如,給定以下文件的目錄;

file1.txt 
file1.txt.xml 
file2.txt 
file2.txt.xml 
file3.xml 
file3.xml.xml 

我該如何提取file1.txt,file2.txt和file3.xml。基本上,我正在尋找任何有我的給定擴展名(本例中爲xml)的對應條目的文件。

在此先感謝。

回答

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(); 
+0

+1不區分大小寫比較 –

+0

這是一種享受。謝謝。我幾乎在那裏,但我不能完全解決它。再次感謝。 –

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 
} 
+0

謝謝詹姆斯。我可以得到這一點,但是,我正在尋找更有活力的東西。例如,基本上,我需要每個文件名都有一個匹配的文件名和我的擴展名(在這種情況下恰好是xml)。 –

1

詹姆斯的解決方案工作。您還可以使用

files.Where(fi => fi.Extension == ext).ToList(); 
+0

D'oh!我檢查了(sorta),但沒有找到擴展屬性(我只是查看了幫助查看器內容面板中列出的FileInfo特定屬性,我不認爲擴展屬性可能是從基類繼承的) –

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); 
+0

我更喜歡這個。這更接近我所需要的。事情是,我不確切知道主要文件集的擴展名。我只能知道,如果有兩個文件具有相同的名稱,另一個具有我的擴展名,那麼這就是我感興趣的文件。我在使用Enumerable.Contains方法來查找文件file.Name.Contains( file.Name +「myknownextension」),但我不確定是否可以創建一些匿名比較器或其他東西,或者如果我必須爲此創建一個新的比較器類。 –

+0

@Mr Moose,你可以省略'mainExtension'部分,並簡單地在'var mainFiles = ...'行中使用單個變量'path'重載。代碼應該仍然在邏輯上工作。我已更新。 –