我在使用Directory类搜索文件时遇到问题。我有很多名称与此类似的文件:
XXX_YYYYMMDD_HHMMSS。
我想仅列出名称中包含该格式日期的文件和 Directory.GetFiles()支持模式,但我不知道是否有允许我使用的模式过滤该名称具有该格式的日期。我想过使用创建日期或修改日期,但它与名称中出现的日期不同,是我需要使用的日期。
有谁知道如何帮助我?谢谢!
答案 0 :(得分:0)
我建议两个步骤过滤:
XXX_YYYYMMDD_HHMMSS
,XXX
和YYYYMMDD
是某些字符的通配符(原始过滤)HHMMSS
YYYYMMDD_HHMMSS
是合适的日期。这样的事情:
var files = Directory
.EnumerateFiles(@"c:\MyFiles", "*_????????_??????.*") // raw filtering
.Where(file => { // fine filtering
string name = Path.GetFileNameWithoutExtension(file);
// from second last underscope '_'
string at = name.Substring(name.LastIndexOf('_', name.LastIndexOf('_') - 1) + 1);
return DateTime.TryParseExact( // is it a proper date?
at,
"yyyyMMdd'_'HHmmss",
CultureInfo.InvariantCulture,
DateTimeStyles.AssumeLocal,
out var _date); })
.ToArray(); // Finally, we want an array
答案 1 :(得分:0)
使用正则表达式怎么样?你可以使用这样的东西:
private static readonly Regex DateFileRegex = new Regex(".*_[0-9]{8}_[\d]{6}.*");
public IEnumerable<string> EnumerateDateFiles(string path)
{
return Directory.EnumerateFiles(path)
.Where(x => this.IsValidDateFile(x));
}
private bool IsValidDateFile(string filename)
{
return DateFileRegex.IsMatch(filename);
}
模式:
.*_[0-9]{8}_[\d]{6}.*
匹配
AHJDJKA_20180417_113028sad.jpg
例如。
注意:我现在无法测试代码。但你明白了。