从目录中获取名称中包含max datetime的文件

时间:2013-06-04 13:23:58

标签: c# datetime max

我在目录中有zip文件。如何获取文件名中包含最大日期时间的文件?

我的文件格式:

Files_2013.06.04_15-42-55.zip Files_2013.06.03_15-42-55.zip ...

5 个答案:

答案 0 :(得分:0)

只需拆分字符串,将日期和时间组合在一起,将其转换为日期时间,然后查看linq以查找最大日期时间。

编辑:不要忘记将所有文件名加载到数组中作为例子,对构造的日期时间执行相同的操作,这样您就可以在与linq返回的最大日期时间相同的索引处找到好的文件名。

答案 1 :(得分:0)

鉴于您的文件似乎使用的是可排序格式,您只需按字母顺序排序顺序对名称进行排序,然后输入第一个条目。 (或者按升序对它们进行排序,然后选择最后一个条目。)

当然,假设你给出的例子真的具有代表性。例如,如果你有不同前缀的混合,你可能想要从每个文件名解析日期部分。 LINQ会使这个合理简单:

var latestFile = files.OrderByDescending(ParseFileDateTime)
                      .FirstOrDefault();

...

public static DateTime ParseFileDateTime(string name)
{
    int dateTimeStartIndex = name.Length - 19;
    if (dateTimeStartIndex < 0)
    {
        throw new ArgumentException("No date/time in filename: " + name);
    }
    string text = name.Substring(dateTimeStartIndex);
    return DateTime.ParseExact(text,
                               "yyyy'.'MM'.'dd'_'HH'-'mm'-'ss",
                               CultureInfo.InvariantCulture);
}
如果FirstOrDefault是空序列,

files将返回null。

请注意,我们只能使用最后19个字符,因为您的日期/时间格式是固定长度。如果您更改它以使用月份的名称(或类似的东西),您需要找出一种不同的方法来找出文件名的哪个部分是日期/时间。

答案 2 :(得分:0)

您可以使用以下流程:

  1. 从特定目录中获取所有文件名。
  2. 解析名称以仅获取日期部分(在'_'符号之间)。使用 Regex.Match
  3. 之后,您可以使用 DateTime.ParseExact 方法获取日期
  4. 之后你可以使用linq Max()方法。

答案 3 :(得分:0)

这是怎么做的:

//var files = Directory.EnumerateFiles("path/to/dir");
var files = {"Files_2013.06.04_15-42-55.zip", "Files_2013.06.03_15-42-55.zip"};
var date = files.Max(f => 
            DateTime.ParseExact(f, "'Files_'yyyy'.'MM'.'dd'_'HH'-'mm'-'ss'.zip'", 
            CultureInfo.InvariantCulture));
Console.WriteLine(date);

答案 4 :(得分:0)

如果所有文件的日期格式相同,并且如果在2013.06.04中 06 是月份编号,则可以避免使用DateTime.Parse或ParseExact。

注意:这些方法仅适用于文件名中的日期遵循模式yyyy.MM.dd_HH-mm-ss。

如果所有文件名总是遵循相同的模式(在您的情况下为'File_yyyy.MM.dd_HH-mm-ss.zip'),则可以使用max element

  var files = Directory.GetFiles(path);
  var fileWithMaxDate = files.Any() ? files.Max(f=>f) : (string)null;

如果只有日期部分遵循模式yyyy.MM.dd_HH-mm-ss:

  private const string DatePattern = "yyyy.MM.dd_HH-mm-ss";
  private static readonly int DatePatternLen = DatePattern.Length;
  var files = Directory.GetFiles(path);
  var fileWithMaxDate = files
                .Where
                  (f =>  Path.GetFileNameWithoutExtension(f).Length >= DatePatternLen)
                .OrderByDescending
                  (f => Path.GetFileNameWithoutExtension(f)
                            .Substring(f.Length - DatePatternLen))
                .FirstOrDefault();

在其他情况下,您需要将日期部分投射到DateTime以进行正确排序