C# 在C中使用通配符查找文件#

C# 在C中使用通配符查找文件#,c#,file,C#,File,我正在尝试从目录中查找文件: String[] search1 = Directory.GetFiles(voiceSource, "85267-*.wav") .Select(path => Path.GetFileName(path)) .ToArray(); String[] search2 = Directory.GetFiles(voiceSour

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

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.wav
85267-s.wav
。但我只想选择
85267-s.wav

search2
做得很好


如何做到这一点?

是的,这是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
这样的文件,这是一种完全不同的文件类型


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

您所经历的行为是因为文件名较短。由于您将为
85267-s.WAV
获得
85267-~1.WAV
,并且这与您的通配符
“85267-*.WAV”
相匹配,因此您将获得这两个文件

这一点在中进行了解释

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

对于解决方法您可以使用
目录。EnumerateFiles
首先选择两个符合您的条件的文件,然后使用
开始与
比较实际(长)文件名部分。记住,惰性评估是不存在的

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

使用
“?”
,作为wildcard@adv12是吗?
*
位于
-
之后而不是之前。在命令提示下,
>dir 85267-*.wav
返回两个文件。它似乎已损坏。首选
Driectory.EnumerateFiles
目录.GetFiles
。目录搜索同时匹配长名称和短名称。使用
dir/x
查看短名称。
85267-s.wav
的短名称可能是
85267-~1.wav
,匹配的正是该短名称。或者,框架应该允许您选择要搜索的文件名类型?嗯,这不是它的实现方式。框架只是将通配符传递给操作系统。这样做非常重要,让文件系统驱动程序进行过滤要快得多。。。等等,我能看到这是怎么回事。我参考你的答案。很有趣!我不知道MS Dos短文件名仍在现代Windows操作系统中使用,特别是因为它们不再基于Dos。是否有任何计划让Windows停止这种支持,例如Windows 10?告诉人们他们必须停止使用他们已有20多年历史的业务关键型应用程序,这种应用程序没有支持,也没有程序员可以修改它,这不是Microsoft的战略。非常普通,顺便说一句,我自己写了很多,而且大部分至今仍在运行。