FCL应用技巧之------DirectoryInfo.GetFiles()搜索模式存在的问题

来源:互联网 发布:双11淘宝报名入口 编辑:程序博客网 时间:2024/05/29 14:10

1 MSDN上关于DirectoryInfo.GetFiles()搜索模式的说明

先看关于DirectoryInfo.GetFiles()的MSDN文档:

public FileInfo[] GetFiles(    string searchPattern,    SearchOption searchOption)

searchPattern 中使用星号通配符时(例如,“*.txt”),匹配行为会根据指定文件扩展名的长度而有所不同。文件扩展名正好是三个字符的searchPattern 将返回扩展名为三个或更多字符的文件,其中前三个字符与searchPattern 中指定的文件扩展名匹配。文件扩展名为一个、两个或三个以上字符的 searchPattern 仅返回扩展名长度正好与searchPattern 中指定的文件扩展名匹配的文件。使用问号通配符字符时,此方法仅返回与指定文件扩展名匹配的文件。例如,假设目录下有两个文件“file1.txt”和“file1.txtother”,使用“file?.txt”搜索模式时只返回第一个文件,而使用“file*.txt”搜索模式时会同时返回这两个文件。

以下列表显示了 searchPattern 参数的不同长度的行为:

  • “*.abc”返回扩展名为 .abc、.abcd、.abcde、.abcdef 等的文件。

  • “*.abcd”只返回扩展名为 .abcd 的文件。

  • “*.abcde”只返回扩展名为 .abcde 的文件。

  • “*.abcdef”只返回扩展名为 .abcdef 的文件。

2 实际执行测试

然后执行如下测试代码:

using System;using System.IO;namespace ConsoleApplication2{    class Program    {        static void Main(string[] args)        {            DirectoryInfo di = new DirectoryInfo(@"F:\test");            DirectoryInfo di2 = new DirectoryInfo(@"Y:\test");            FileInfo[] fis = di.GetFiles("*.doc", SearchOption.AllDirectories);            FileInfo[] fis2 = di2.GetFiles("*.doc", SearchOption.AllDirectories);            Console.WriteLine("位于本地硬盘上的文件夹");            foreach (FileInfo fi in fis)            {                Console.WriteLine(fi.Name);            }            Console.WriteLine("位于SAMBA服务器上的文件夹");            foreach (FileInfo fi in fis2)            {                Console.WriteLine(fi.Name);            }        }    }}

注:代码中的两个文件夹"F:\test"与"Y:\test"是内容完全一样的,其中Y是一个映射分区,内容实际是一台samba服务器共享的文件夹,里面是一些Word文档,内容如下:


再看看程序的运行结果:


3 测试结果分析

可见,如果是本地硬盘,那么确实如MSDN所说,*.doc既会匹配.doc也会匹配.docx文档。但是如果目录所在地不是本地硬盘(本例是Linux上的samba共享),那么就只会匹配.doc而不会匹配.docx。

这也说明了MSDN的说法不够准确,至少不全面。希望对大家有所帮助。


原创粉丝点击