【问题标题】:Directory.GetFiles with date in name patternDirectory.GetFiles 名称模式中的日期
【发布时间】:2018-04-17 09:23:08
【问题描述】:

我在使用 Directory 类搜索文件时遇到问题。我有很多类似这样的文件:

XXX_YYYYMMDD_HHMMSS。

我只想列出名称和日期格式的文件,并且 Directory.GetFiles() 支持模式,但我不知道是否有模式可以让我过滤该名称具有该格式的日期。我想过用创建日期或修改日期,但它与名称中的那个不一样,是我需要使用的那个。

有人知道如何帮助我吗?谢谢!

【问题讨论】:

  • 在检索文件名后有什么原因不能过滤?
  • 因为在名称中是应该处理该文件的日期......是的......我知道......这很危险,但客户希望这样并且不会改变他的头脑:D
  • 因此您至少可以使用文字字符串过滤日期...
  • 但这要求我创建一个文字 foreach 日期,不是吗?我在每次迭代中都在考虑,获取名称并尝试转换为日期。如果这可行,我可以跟随迭代......但我不知道这是否是最好的方式。
  • 目前还不清楚为什么您需要在 Directory.GetFiles 调用中进行此操作。只需获取所有文件名,然后过滤它们。

标签: c# file filter directory


【解决方案1】:

使用正则表达式怎么样?你可以适当地使用这样的东西:

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

例如。

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

【讨论】:

  • Regex 是可以的,如果我们可以保证该模式是一个正确的日期,否则我们会遇到 闰年 等问题。例如,ABC_20170229_141516.txt 不是有效文件名(29 Feb 2017
  • 我没有想到使用正则表达式来做到这一点。谢谢!
【解决方案2】:

我建议步过滤:

  1. 通配符(原始过滤)XXX_YYYYMMDD_HHMMSS 其中XXXYYYYMMDDHHMMSS 是一些字符
  2. 精细过滤 (Linq) 我们确保 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 2021-08-21
    相关资源
    最近更新 更多