2012-02-21 86 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); 
}