2013-05-14 91 views
2

我需要根據文件名中的日期過濾目錄中的文件。根據文件名中的日期過濾文件夾中的文件

名稱具有四組數字:

9999.99999.201305021219.99999999.txt 

當有多個文件與第二組數字重複我想用基於第三組數字的日期較新的一個(爲yyyymmddhhmm)。

如果有這些目錄中的文件:

1 1100.04037.201305090945.04542592.TXT 
2 1100.04041.201305091108.04542707.TXT 
3 1100.04041.201305091117.60563353.TXT 
4 1100.04047.201305080942.04541666.TXT 
5 1100.24084.201305021658.04539125.TXT 
6 1100.24084.201305061731.04540560.TXT 

我希望那些在第2和5被丟棄。這是我成功地遍歷目錄中的文件:

public static void Main(string[] args) 
    { 
     string directory = @"\\some\net\path"; 
     string[] arquivos = Directory.GetFiles(directory, "1100.*.txt", SearchOption.TopDirectoryOnly); 
     foreach (string arquivo in arquivos) 
     { 
      Console.WriteLine(arquivo.Substring(directory.Length + 1)); 
     } 
     Console.ReadLine(); 
    } 
+0

DateTime.ParseExact和匿名對象在這裏你的朋友。 –

回答

3
var files = arquivos 
      .Select(f => new{OrgName = f, Parts = new FileInfo(f).Name.Split('.')}) 
      .GroupBy(x=>x.Parts[1]) 
      .Select(g=>g.OrderByDescending(x=>x.Parts[2]).First().OrgName); 

foreach (string arquivo in files) 
{ 
    ..... 
} 
2

根據多少文件在我建議使用一個字典,你通過遍歷文件夾來保存你的價值觀的目錄。您可以使用第二組數字作爲關鍵字,然後檢查該關鍵字是否已經存在於字典中。如果是這樣,你可以執行任何比較,以確定你保留哪一個。

1
var ci = CultureInfo.InvariantCulture; 

// first, parse your input files: 
var parsed = 
from f in arquivos 
let c = Path.GetFileName(f).Split('.') 
select new 
{ 
    Key = c[1], 
    Name = f, 
    Date = DateTime.ParseExact(c[2], "yyyyMMddHHmm", ci) 
}; 

// now, group by file id, and order by file date, 
// picking record by latest date: 
var result = 
parsed.GroupBy(g => g.Key) 
.Select(t => t.OrderByDescending(z => z.Date) 
.Select(z => z.Name).First()).ToList(); 
相關問題