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的战略。非常普通,顺便说一句,我自己写了很多,而且大部分至今仍在运行。