C# 使用ParseExact从文件名获取日期

C# 使用ParseExact从文件名获取日期,c#,string,C#,String,我试图在一个目录中找到日期最高的文件。问题是日期附加到文件名。我正在使用下面的代码来尝试提取最大日期,但是我在使用ParseExact时遇到了问题 //Gather all of the files in the local directory var files = Directory.EnumerateFiles(r.getLeadLocalFile()); returnDateTime = files.Max(f => DateTime.ParseExact(f, "MMddyyXX

我试图在一个目录中找到日期最高的文件。问题是日期附加到文件名。我正在使用下面的代码来尝试提取最大日期,但是我在使用ParseExact时遇到了问题

//Gather all of the files in the local directory
var files = Directory.EnumerateFiles(r.getLeadLocalFile());
returnDateTime = files.Max(f => DateTime.ParseExact(f, "MMddyyXXXX.csv", CultureInfo.InvariantCulture));
我继续得到以下错误:

String was not recognized as a valid DateTime.
我可以看出正在传入文件路径的值,因为“f”的值如下:

\\\\vamarnas02\\users\\meggleston\\User Files\\Leads\\110716ENH9.csv
ENH9的值可能会因文件而异


如何从文件名中获取日期时间?

尝试只传递文件名“110716ENH9.csv”,而不是文件的完整路径

发件人:

使用指定的格式和区域性特定的格式信息,将日期和时间的指定字符串表示形式转换为其等效的日期时间。字符串表示形式的格式必须与指定的格式完全匹配

从您提供的内容来看,您的格式不完全匹配

--
仅将文件名的前6个字符传递给ParseExact函数,并将格式修改为“MMddyy”。

在解析之前,需要拆分日期文本。下面的代码片段应该会有所帮助

假设变量f是文件名

DateTime.ParseExact(f.Substring( f.LastIndexOf("\\") + 1,  6), "MMddyy", CultureInfo.InvariantCulture);

这是另一种方法。不需要分拆任何东西。但一个坏文件名(与您当前的方法一样)会毁掉它:

//Gather all of the files in the local directory
var files = new DirectoryInfo(r.getLeadLocalFile()).GetFiles("*.csv");
returnDateTime = files.Max(f => DateTime.ParseExact(f.Name.Substring(0, 6), "MMddyy", CultureInfo.InvariantCulture));

你真的需要在这里使用ParseExact吗?因为您似乎只需要获取Int32值,然后进行比较。
因此,另一种方法是:您可以使用一些正则表达式从提供的路径中提取日期部分。例如,您可以使用此选项:

\\\d{6}  // 2 slashes and 6 digits. I'm not an expert in regex, but seems that this one is enough for your task.
然后修剪
\
零件。所以在循环中类似这样的东西:

private string ExtractDateFromFilename(string filename) {
        var m = Regex.Match(filename, @"\\\d{6}");
        if (!string.IsNullOrEmpty(m.Value))
            return m.Value.Substring(1);
        return "";
    } 

您是否可以控制这些文件的创建方式…您是否可以在日期和名称之间添加一个
,像
110716_ENH9.csv
?你不能简单地将文件名的前6个字符作为子字符串吗?我无法控制文件名,也不知道如何使用子字符串方法获取最大日期时间。仍然不认为ParseExact是查找最大日期的好选择,您必须重新检查文件是否完全符合日期格式,否则将引发异常。如果保存文件的格式在未来的项目迭代中发生更改,则必须使用ParseExact中的另一种格式重新生成代码。我已将代码更改为以下格式,但仍然收到相同的错误:
returnDateTime=files.Max(f=>DateTime.ParseExact(Path.GetFileNameWithoutExtension(f),“mmddyyyxxxx”,CultureInfo.InvariantCulture)日期格式中没有通配符。您需要为文件名添加子字符串。因为您知道日期格式只需要前6个字符,所以只需将文件名的前6个字符传递给ParseExact函数,并将格式修改为“MMddyy”,就可以了。我想我看这个太久了。谢谢你帮助我这样的傻瓜。如果性能有问题,我不会使用正则表达式,IndexOf会产生更快的执行速度times@user2818985,当然你是对的,正则表达式在大字符串上的速度很慢(与字符串方法相比),但在将来需要更改某些条件或有一些复杂的比较逻辑时非常灵活。对于小字符串,而不是数百万次的比较,这不会有明显的区别(很抱歉,现在没有这个示例的验证,可能以后会添加一些)。