2009-04-24 78 views
7

基本上,我有这样的代码:为什么DirectoryInfo.GetFiles()匹配与掩码不匹配的文件?

DirectoryInfo dir = new DirectoryInfo(@"\\MYNETWORK11\ABCDEFG\ABCDEFGHIJKL\00806\"); 
FileInfo[] files = dir.GetFiles("200810*"); 

我期望它匹配任何开头的文件200810.但是,它匹配命名

20070618_00806.bak和20070817_00806.bak文件(星星AREN在文件名中,这是我可以包含下划线的唯一方法)

我试过它与命令提示符的目录,它也匹配这些文件。为什么?

编辑:

也许使用C:作为例子是不是一件好事。我实际查询的目录是网络共享 \\ MYNETWORK11 \ ABCDEFG \ ABCDEFGHIJKL \ 00806 \

如果检查短名称与它有什么关系,20070817_00806.bak不会是200708〜1。李明博?这不符合任何

+0

这并没有完全解释它,所以我只作为注释添加,但_是用于匹配目的的特殊字符。将这2个文件名放在_位置,然后再稍微靠近一点。 – 2009-04-24 15:16:47

+0

@Joel,你是说_特别在windows中还是在格式化? – scottm 2009-04-24 15:18:33

回答

14

msdn指出

“因为针对用8.3文件名 格式和长文件名格式 文件名, 一个此方法检查搜索模式类似于“*1*.txt” 可能会返回意外的文件名。对于 例如,使用的 搜索模式“*1*.txt”将返回 “longfilename.txt”因为 相当于8.3文件名格式会 是“longf~1.txt”。“

难道这是原因吗?

4

我无法重现此,无论是从命令行或测试程序:

c:\Users\Jon\Test>echo > 20070618_00806.bak 

c:\Users\Jon\Test>echo > 2007081700806.bak 

c:\Users\Jon\Test>dir 200810* 
Volume in drive C is OS 
Volume Serial Number is B860-7E20 

Directory of c:\Users\Jon\Test 

File Not Found 

和C#应用程序:

using System; 
using System.IO; 

class Test 
{ 
    static void Main() 
    { 
     foreach (var file in new DirectoryInfo(".").GetFiles("200810*")) 
     { 
      Console.WriteLine(file); 
     } 
    } 
} 

(这并未不打印任何结果。)

也许有一些操作系统设置在某个地方正在发挥作用...你使用哪种操作系统? (我在32位Vista。)

1

GetFiles将搜索长文件名和短文件名......它不是以某种方式匹配短文件名吗?

6

在命令行试试这个:

dir /x 200810* 

的“/ X”会使其显示的短文件名,以及长文件名。这将让你看到短文件名实际上是否以“200810”开头。