我正在尝试从目录中查找文件:
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
表现不错。
我该怎么做?
答案 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