我在目录中有zip文件。如何获取文件名中包含最大日期时间的文件?
我的文件格式:
Files_2013.06.04_15-42-55.zip Files_2013.06.03_15-42-55.zip ...
答案 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)
您可以使用以下流程:
答案 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以进行正确排序