2

我希望获得某个扩展名(递归)的所有文件的列表,但只有以该扩展名结尾的文件。

例如,我希望获取所有扩展名为“.exe”的文件,如果我有以下文件:

文件1.exe、文件2.txt.exe、文件3.exe.txt、文件4.txt.exe1、文件5.txt

我希望得到 1 个文件的列表,即:file1.exe.

我正在尝试使用以下行:

List<string> theList = Directory.GetFiles(@"C:\SearchDir", "*.exe", SearchOption.AllDirectories).ToList();

但我得到的是以下三个文件的列表:file1.exe , file2.txt.exe , file4.txt.exe1

有任何想法吗?

4

2 回答 2

4

这是一个常见的问题。请注意MSDN 文档

在 searchPattern 中使用星号通配符(例如“*.txt”)时,扩展名正好是三个字符长时的匹配行为与扩展名长度多于或少于三个字符时的匹配行为不同。文件扩展名正好为三个字符的 searchPattern返回具有三个或更多字符扩展名的文件,其中前三个字符与 searchPattern 中指定的文件扩展名匹配。

不能通过搜索.exe扩展来解决;您需要在客户端代码中再过滤一次结果。

现在,还需要注意的一件事是这一点。以下示例实际上将被视为可执行文件:

file1.exe
file2.txt.exe

而从技术上讲,这个文件不会被视为可执行文件。

file4.txt.exe1

那么问题就变成了,你想要什么算法?在我看来,您想要以下内容:

  • 扩展名为exe.
  • 没有多个扩展名的文件。

查看 Ahmed 的答案,了解获得所需算法的绝妙方法。

于 2013-11-07T12:49:39.817 回答
2

尝试这个:

var exeFiles = Directory.EnumerateFiles(sourceDirectory, 
                                        "*", SearchOption.AllDirectories)
               .Where(s => s.EndsWith(".exe") && s.Count( c => c == '.') == 2)
               .ToList();
于 2013-11-07T12:53:08.427 回答