从目录中获取名称中带有最大日期时间的文件
本文关键字:日期 时间 文件 获取 | 更新日期: 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返回的最大日期时间相同的索引处找到合适的文件名。
您可以按照以下流程操作:
- 获取指定目录下的所有文件名。
- 解析名称以获取日期部分(在'_'符号之间)。使用正则表达式。匹配 之后,您可以使用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以进行正确排序