Directory.GetFiles,名称模式中包含日期

时间:2018-04-17 09:23:08

标签: c# file filter directory

我在使用Directory类搜索文件时遇到问题。我有很多名称与此类似的文件:

XXX_YYYYMMDD_HHMMSS。

我想仅列出名称中包含该格式日期的文件和 Directory.GetFiles()支持模式,但我不知道是否有允许我使用的模式过滤该名称具有该格式的日期。我想过使用创建日期或修改日期,但它与名称中出现的日期不同,是我需要使用的日期。

有谁知道如何帮助我?谢谢!

2 个答案:

答案 0 :(得分:0)

我建议两个步骤过滤:

  1. 其中XXX_YYYYMMDD_HHMMSSXXXYYYYMMDD是某些字符的通配符(原始过滤)HHMMSS
  2. 精确过滤( Linq )我们确保YYYYMMDD_HHMMSS是合适的日期。
  3. 这样的事情:

    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

例如。

注意:我现在无法测试代码。但你明白了。