0

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

我的文件格式:

文件_2013.06.04_15-42-55.zip 文件_2013.06.03_15-42-55.zip ...

4

5 回答 5

1

这是如何做到的:

//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);
于 2013-06-04T13:42:12.013 回答
1

鉴于您的文件似乎使用可排序格式,您只需按字典顺序降序对名称进行排序,然后取第一个条目。(当然,或者按升序对它们进行排序并取最后一个条目。)

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

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

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

于 2013-06-04T13:33:48.840 回答
0

您可以使用以下流程:

  1. 从特定目录获取所有文件名。
  2. 解析名称以仅获取日期部分(在 '_' 符号之间)。使用正则表达式匹配
  3. 之后,您可以使用DateTime.ParseExact方法获取日期集合
  4. 之后,您可以使用 linq Max() 方法。
于 2013-06-04T13:33:59.793 回答
0

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

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

于 2013-06-04T13:28:46.990 回答
0

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

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

如果所有文件名始终遵循相同的模式(在您的情况下为“File_yyyy.MM.dd_HH-mm-ss.zip”),那么您可以使用 max 元素

  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 才能正确排序

于 2013-06-04T14:07:30.617 回答