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

时间:2015-01-21 14:56:56

标签: c# file

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

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表现不错。

我该怎么做?

2 个答案:

答案 0 :(得分:8)

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

坦率地说,短名字一代是上个世纪应该被关闭的遗物。但这通常不是你能控制自己的东西。你必须处理这些偶然的比赛并仔细检查你得到的回报。以正则表达式为例。

答案 1 :(得分:7)

您遇到的行为是因为文件名较短。由于85267-~1.WAV会获得85267 -s.wav,因此与您的通配符"85267-*.wav"匹配,您将获得两个文件。

Directory.GetFiles Method (String, String)

中解释了这一点
  

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

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

StartsWith
相关问题