从目录中获取名称中带有最大日期时间的文件

本文关键字:日期 时间 文件 获取 | 更新日期: 2023-09-27 18:16:47

目录中有zip文件。我怎么能得到文件与最大日期时间在文件名?

我的文件格式:

files_2013.06.04_15 - 42 - 55. - zipfiles_2013.06.03_15 - 42 - 55. - zipdiv…

假设您的文件使用的是可排序格式,那么您可以按字典降序对名称进行排序,并取第一个条目。(或者按升序排序,当然取最后一项)

当然,这是假设你给出的例子是真正具有代表性的。例如,如果您有不同前缀的混合物,您可能希望从每个文件名解析日期部分。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);
}

如果files是空序列,FirstOrDefault将返回null。

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

从目录中获取名称中带有最大日期时间的文件

方法如下:

//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);

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

edit:不要忘记将所有文件名加载到数组中,例如,对构造的datetime也这样做,这样您就可以在与linq返回的最大日期时间相同的索引处找到合适的文件名。

您可以按照以下流程操作:

  1. 获取指定目录下的所有文件名。
  2. 解析名称以获取日期部分(在'_'符号之间)。使用正则表达式。匹配
  3. 之后,您可以使用DateTime。获取日期集合的ParseExact方法之后你可以使用linq Max()方法。

如果所有文件的日期格式相同,并且如果在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以进行正确排序