【问题标题】:Find files using wild card in C#在 C# 中使用通配符查找文件
【发布时间】:2015-01-21 14:56:55
【问题描述】:

我正在尝试从目录中查找文件:

String[] search1 = Directory.GetFiles(voiceSource, "85267-*.wav")
                                 .Select(path => Path.GetFileName(path))
                                 .ToArray();

String[] search2 = Directory.GetFiles(voiceSource, "85267 *.wav")
                                 .Select(path => Path.GetFileName(path))
                                 .ToArray();

但在search1 中,它同时选择了85267-s.wav85267 -s.wav。但我只想选择85267-s.wav

search2 做得很好。

我该怎么做?

【问题讨论】:

  • 使用'?',作为通配符
  • @adv12:是吗? * 出现在 - 之后而不是之前。
  • 在命令提示符下,>dir 85267-*.wav 返回两个文件。好像坏了。
  • 更喜欢Driectory.EnumerateFiles 而不是Directory.GetFilesmsdn.microsoft.com/en-us/library/…
  • 目录搜索匹配长名称和短名称。使用 dir /x 查看短名称。 85267 -s.wav 的简称可能是85267-~1.wav,匹配的就是那个简称。

标签: c# file


【解决方案1】:

您遇到的行为是因为文件名短。由于您将获得85267-~1.WAV85267 -s.wav 并且因为它与您的通配符"85267-*.wav" 匹配,所以您将获得两个文件。

Directory.GetFiles Method (String, String)中有解释

因为此方法检查 文件名与 8.3 文件 名称格式和长文件名格式,搜索模式类似 到“1.txt”可能会返回意外的文件名。例如,使用一个 “1.txt”的搜索模式将返回“longfilename.txt”,因为 等效的 8.3 文件名格式为“longf~1.txt”。

解决方法您可以使用Directory.EnumerateFiles首先选择符合您的条件的两个文件,然后使用StartsWith比较实际(长)文件名部分。请记住 EnumerateFiles 进行惰性评估。

String[] search1 = Directory.EnumerateFiles(@"C:\test", "85267-*.wav")
                         .Where(file => Path.GetFileName(file).StartsWith("85267-"))
                         .Select(path => Path.GetFileName(path))
                         .ToArray();

【讨论】:

    【解决方案2】:

    是的,这是 MS-Dos 8.3 短名称支持的副作用,目前大多数文件系统仍启用该功能。您可以使用 DIR /X 命令看到的东西,它会显示这些短名称。在我的机器上:

    C:\temp>dir /x *.wav
    
    01/21/2015  09:11 AM                 6 85267-~1.WAV 85267 -s.wav
    01/21/2015  09:11 AM                 6              85267-s.wav
                   2 File(s)             12 bytes
                   0 Dir(s)  235,121,160,192 bytes free
    

    请注意“85267 -s”的简称缺少空格。它不是短名称中的有效字符。现在剩下的也与您的通配符匹配。

    问题不在于这些短名称,像*.wav 这样的通配符也会匹配像foobar.wavx 这样的文件,这是一种完全不同的文件类型。

    坦率地说,短名一代是上个世纪的遗物,今天应该关闭。但这通常不是您可以控制自己的事情。您必须处理这些意外匹配并仔细检查您得到的结果。以正则表达式为例。

    【讨论】:

    • 或者框架应该让您选择要搜索的文件名类型?
    • 好吧,这不是它的实现方式。该框架只是将通配符传递给操作系统。以这种方式工作非常重要,让文件系统驱动程序执行过滤要快得多。
    • 好吧,如果文件系统驱动程序......等等,我可以看到它的发展方向。我参考你的回答。
    • 非常有趣!我不知道 MS-Dos 短文件名仍在现代 Windows 操作系统中使用,特别是因为它们不再基于 DOS。 Windows 是否有任何计划停止该支持,例如Windows 10?
    • 告诉人们他们必须停止使用他们已有 20 多年历史的关键业务应用程序,这种应用程序没有支持,也没有程序员可以修改它,这不是 Microsoft 的策略。顺便说一句,很常见,我自己写了很多,而且大部分内容今天仍在运行。
    猜你喜欢
    • 2018-09-19
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    相关资源
    最近更新 更多