2013-11-27 37 views
10

我使用下面的行返回特定的文件...的GetFiles() - 搜索模式

FileInfo file in nodeDirInfo.GetFiles("*.sbs", option) 

但也有扩展名为“.sbsar”目录中的其他文件,它是让他们太。如何区分搜索模式中的“.sbs”和“.sbsar”?

+1

你不能(至少与GetFiles/GetDirectories)。这是搜索模式的“限制”。您应该遍历结果并手动过滤所需的结果。 – varocarbas

+0

也看看这个:http://msdn.microsoft.com/en-us/library/wz42302f(v=vs.110).aspx –

+0

[确切的文件扩展名与GetFiles()匹配的可能重复?]( http://stackoverflow.com/questions/5573063/exact-file-extension-match-with-getfiles) – Borja

回答

4

试试这个,使用文件扩展名来筛选。

FileInfo[] files = nodeDirInfo.GetFiles("*", SearchOption.TopDirectoryOnly). 
      Where(f=>f.Extension==".sbs").ToArray<FileInfo>(); 
3

这就是GetFiles()下面的Win32 API(FindFirstFile)的行为正在反映给你。

如果您必须使用GetFiles(),则需要进行自己的过滤。例如:

GetFiles("*", searchOption).Where(s => s.EndsWith(".sbs", 
    StringComparison.InvariantCultureIgnoreCase)); 

或者更高效:

EnumerateFiles("*", searchOption).Where(s => s.EndsWith(".sbs", 
    StringComparison.InvariantCultureIgnoreCase)); 

请注意,我用StringComparison.InvariantCultureIgnoreCase处理的事实,Windows的文件名不区分大小写。

如果性能问题,即搜索必须处理大量文件的目录,则执行两次过滤效率更高:一次是在GetFilesEnumerateFiles的调用中,一次是清理不需要的文件名称。例如:

GetFiles("*.sbs", searchOption).Where(s => s.EndsWith(".sbs", 
    StringComparison.InvariantCultureIgnoreCase)); 
EnumerateFiles("*.sbs", searchOption).Where(s => s.EndsWith(".sbs", 
    StringComparison.InvariantCultureIgnoreCase)); 
+0

@Joey这只是感觉有点肮脏,我复制了过滤器。但也许它会有一个perf的含义。如果没有,那么我宁愿只有一个过滤器。 –

+0

虽然速度更快,但是;-)在我的小测试中(运行在我们完整的源文件夹中,搜索'* .cpp'),它在'GetFiles'中指定过滤器的速度大约快10-25%。 'EnumerateFiles'稍微慢一点,但可能会使用更少的内存,特别是对于大型结果集。 – Joey

+0

@Joey是的,我认为这是合理的。我想它归结为性能和纯度之间的平衡!我已经在回答中介绍了这一点。 –

9

您遇到的问题是搜索模式的limitation,在Win32的API中。

阿是searchPattern与恰好 三个字符的文件扩展名(例如* .txt)的返回具有三个或更多个 字符,其中前三个字符的是searchPattern指定的文件的扩展名 匹配扩展名的文件。

我的解决办法是手动过滤结果,使用LINQ:

nodeDirInfo.GetFiles("*.sbs", option).Where(s => s.EndsWith(".sbs"), 
    StringComparison.InvariantCultureIgnoreCase)); 
+2

这里你不会说明信件的情况。 –

+0

这是真的,固定的。 –

0

docs

提到当在是searchPattern使用星号通配符它,一个 是searchPattern用正好三个字符的文件扩展名 返回具有三个或更多字符的扩展名的文件。当 使用问号wild卡字符,此方法只返回 与指定的文件扩展名匹配的文件。

+0

如果这是真的,那将是不可思议的。不幸的是,它不是,并且在这里出现了对MSDN中searchPattern描述不佳的新情节:)我感到好奇并做了一些测试,并在此得出我的结论... – varocarbas

+0

@varocarbas确实..想知道在哪里使用'?' .OP可以使用'* a?.sbs' ..尽管这需要'a'在文件名中 – Anirudha

+2

'nodeDirInfo.GetFiles(“5?.txt”);''返回任何只有.txt的文件(而不是.txtwhatever)在名称中包含两个字符,其中一个是5.'nodeDirInfo.GetFiles(“?。txt”);'返回名称中只有一个字符的任何.txt文件(不包括.txtwhatever)。如果您知道要查找的文件名的最大长度(?.txt),则可以通过使用“????。txt”方法来获取仅* .txt的文件名(txt),该文件名将回溯所有名称中包含1或2个字符的文件;用1,2和3等所有的数字等等)。 – varocarbas