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

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文档,内容如下:


再看看程序的运行结果:

FCL应用技巧之------DirectoryInfo.GetFiles()搜索模式存在的问题_第1张图片

3 测试结果分析

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

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


你可能感兴趣的:(FCL应用技巧之------DirectoryInfo.GetFiles()搜索模式存在的问题)