2012-02-21 84 views
5

我想通過寫日期以獲得目錄中的所有文件的列表創建日期以獲得目錄中的文件列表:嘗試使用LINQ

private void Form1_Load(object sender, EventArgs e) { 
    DateTime LastCreatedDate = 
       Properties.Settings.Default["LastDateTime"].ToDateTime(); 

    string [] filePaths = Directory.GetFiles(@"\\Pontos\completed\", "*_*.csv") 
         .OrderBy(p => System.IO.File.GetLastWriteTime(p)) 
         .Where(p>=LastCreatedDate); 
} 

問題

  1. 如何正確地執行WHERE子句以僅獲取大於或等於我設置中的日期的文件?
  2. string []對此不起作用,因爲它不知道如何進行轉換。我應該使用哪種數據類型?

回答

1

未經測試,但應該工作:

private void Form1_Load(object sender, EventArgs e) 
{ 
    DateTime LastCreatedDate = Properties.Settings.Default["LastDateTime"].ToDateTime(); 
    var filePaths = Directory.GetFiles(@"\\Pontos\completed\", "*_*.csv").Select(p => new {Path = p, Date = System.IO.File.GetLastWriteTime(p)}) 
     .OrderBy(x=>x.Date) 
     .Where(x=>x.Date>=LastCreatedDate); 

} 
+0

我更新了代碼 – Novakov 2012-02-21 22:56:27

+0

非常感謝!我將如何解析文件路徑中的每個元素? foreach(文件路徑中的var文件)? – 2012-02-21 22:58:03

+0

您可以使用foreach(filePath中的var文件)。每個元素都是具有屬性Path和Date的匿名類型。 – Novakov 2012-02-21 22:59:11

1

你可以做這樣的事情,而不是:

Directory.GetFiles(@"\\Pontos\completed\", "*_*.csv") 
     .Select(p => new { FileName = p, Modified = System.IO.File.GetLastWriteTime(p) }) 
     .Where(p => p.Modified > LastCreatedDate) 
     .OrderBy(p => p.Modified); 
+0

錯誤不能隱式轉換類型'System.Linq.IOrderedEnumerable '到'string []'\t C:\ Users \ – 2012-02-21 22:56:50

+0

使用'var x = ...'。這會給你一個創建的匿名類型的枚舉結果。 – 2012-02-21 22:59:31

+0

謝謝!你能幫助這個http://stackoverflow.com/questions/9386705/c-sharp-getting-last-element-in-linq-statement – 2012-02-21 23:03:35

2

有沒有你不使用DirectoryInfo代替Directory任何理由 - 這將保存您不得不將文件路徑解析回Files以獲取日期,或將日期存儲在單獨的變量中:

DateTime lastCreatedTime = new DateTime(2012, 01, 30, 05, 12, 00); 

var files = new DirectoryInfo(@"\\Pontos\completed\").GetFiles("*_*.csv") 
      .Where(f => f.LastWriteTime >= lastCreatedTime) 
      .OrderBy(f => f.LastWriteTime) 
      .Select(f => new {f.FullName}); 

foreach (var file in files) { 
    Console.WriteLine(file.FullName); 
}