我在目录中有 zip 文件。如何获取文件名中包含最大日期时间的文件?
我的文件格式:
文件_2013.06.04_15-42-55.zip 文件_2013.06.03_15-42-55.zip ...
这是如何做到的:
//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);
鉴于您的文件似乎使用可排序格式,您只需按字典顺序降序对名称进行排序,然后取第一个条目。(当然,或者按升序对它们进行排序并取最后一个条目。)
当然,这是假设您给出的示例确实具有代表性。例如,如果您混合了不同的前缀,您可能希望从每个文件名中解析日期部分。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 个字符。如果您曾经将其更改为使用月份名称(或类似名称),则需要找出另一种方法来找出文件名的哪一部分是日期/时间。
您可以使用以下流程:
只需拆分您的字符串,将日期和时间放在一起,将其转换为日期时间,然后查看 linq 以找到最大日期时间。
编辑:例如,不要忘记将所有文件名加载到数组中,对构造的日期时间执行相同的操作,这样您就会在与 linq 返回的最大日期时间相同的索引处找到好的文件名。
如果所有文件的日期格式相同,并且如果在 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 才能正确排序