.NET Framework中的DirectoryInfo.GetFiles方法,可以在一个文件夹下通过通配符找出符合条件的文件。

我们首先在文件夹C:\DemoFolder下定义两个文件:demo.xls和demo.xlsx

然后我们新建一个.NET Framework控制台项目,然后在其Program类的Main方法中敲入如下代码:

class Program
{
static void Main(string[] args)
{
DirectoryInfo directoryInfo = new DirectoryInfo(@"C:\DemoFolder");//寻找在C:\DemoFolder文件夹下的文件 var files = directoryInfo.GetFiles("*.xls");//寻找文件夹下的所有.xls文件 foreach (var file in files)
{
Console.WriteLine(file.Name);//输出找到的每个文件名
} Console.WriteLine("Press key to end...");
Console.ReadKey();
}
}

这段代码的本意是找出文件夹C:\DemoFolder下的所有.xls文件,但是我们看看输出结果如下:

我们惊讶地发现,明明我们输入DirectoryInfo.GetFiles方法的参数是*.xls,但是现在.xlsx后缀的文件也被找出来了。这个问题的根本原因是.NET Framework中,DirectoryInfo.GetFiles方法的通配符遵循了一套特殊的匹配规则,导致了*.xls匹配.xlsx后缀也是成功的。

微软MSDN上对此的解释如下:

The following list shows the behavior of different lengths for the searchPattern parameter:
"*.abc" returns files having an extension of.abc,.abcd,.abcde,.abcdef, and so on.
"*.abcd" returns only files having an extension of.abcd.
"*.abcde" returns only files having an extension of.abcde.
"*.abcdef" returns only files having an extension of.abcdef.

详情请见下面MSDN链接的文章:

DirectoryInfo.GetFiles Method

此外上面MSDN中也提到如果文件夹中的文件较多,推荐使用DirectoryInfo.EnumerateFiles方法效率更高,原因如下:

The EnumerateFiles and GetFiles methods differ as follows:

EnumerateFiles
When you use EnumerateFiles, you can start enumerating the collection of FileInfo objects before the whole collection is returned.

GetFiles
When you use GetFiles, you must wait for the whole array of FileInfo objects to be returned before you can access the array.
Therefore, when you are working with many files and directories, EnumerateFiles can be more efficient.
If there are no files in the DirectoryInfo, this method returns an empty array.

但是我测试了下本文所述问题在.NET Core中是不存在的,我们新建一个.NET Core控制台项目,然后复制粘贴上面Program类Main方法中的代码到.NET Core控制台项目,执行结果如下:

可以看到.NET Core正确地找出了.xls后缀的文件,没有找出.xlsx后缀的文件,所以目前来看本文所述问题只存在于.NET Framework中的DirectoryInfo.GetFiles和DirectoryInfo.EnumerateFiles方法上。

所以在.NET Framework中如果我们要用DirectoryInfo.GetFiles方法找出.xls后缀的文件,最保险的方法应该是下面这样:

class Program
{
static void Main(string[] args)
{
DirectoryInfo directoryInfo = new DirectoryInfo(@"C:\DemoFolder");//寻找在C:\DemoFolder文件夹下的文件 var files = directoryInfo.GetFiles().Where(f => f.Name.EndsWith(".xls")).ToArray();//寻找文件夹下的所有.xls文件 foreach (var file in files)
{
Console.WriteLine(file.Name);//输出找到的每个文件名
} Console.WriteLine("Press key to end...");
Console.ReadKey();
}
}

通过EndsWith方法可以准确找出以.xls后缀结尾的所有文件。

在.NET Framework中慎用DirectoryInfo.GetFiles方法的更多相关文章

  1. Android Framework中的线程Thread及它的threadLoop方法

    当初跟踪Camera的代码中的时候一直追到了HAL层,而在Framework中的代码看见了许很多多的Thread.它们普遍的特点就是有一个threadLoop方法.依照字面的意思应该是这个线程能够循环 ...

  2. 在.Net Framework中调用Python的脚本方法 (以VB和C#为例)

    某个项目中涉及到这样一个情景: VB/C#写的原始项目要调用Python的一些方法完成特殊的操作, 那么这就涉及到了,在.Net Framework中如何调用Python的脚本方法. 具体步骤流程如下 ...

  3. iOS在framework中使用CoreData出现崩溃问题及解决方法

    公司项目中有一个功能,保存授权令牌数据.最开始只有一条数据,所以就直接保存在了userdefaults中.后来需要两条数据,还是保存在userdefaults中,其中一条为固定的,另一条不固定可以进行 ...

  4. Entity Framework 教程——Entity Framework中的实体类型

    Entity Framework中的实体类型 : 在之前的章节中我们介绍过从已有的数据库中创建EDM,它包含数据库中每个表所对应的实体.在EF 5.0/6.0中,存在POCO 实体和动态代理实体两种. ...

  5. 减小ipa体积之删除frameWork中无用mach-O文件

    最近项目末期, 我们团队为了ipa的大小使用不少的体积减小的方法, 除了一些常规的方法之外, 我分享一下自己研究出来的新思路. 首先我们来简单的介绍一下mach-O. 什么是mach-O? Mach- ...

  6. 转-Spring Framework中的AOP之around通知

    Spring Framework中的AOP之around通知 http://blog.csdn.net/xiaoliang_xie/article/details/7049183 标签: spring ...

  7. 在android开发中使用multdex的方法-IT蓝豹为你整理

    Android系统在安装应用时,往往需要优化Dex,而由于处理工具DexOpt对id数目的限制,导致其处理的数目不能超过65536个,因此在Android开发中,需要使用到MultiDex来解决这个问 ...

  8. Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->Spring Framework中的spring web MVC模块

    spring framework中的spring web MVC模块 1.概述 spring web mvc是spring框架中的一个模块 spring web mvc实现了web的MVC架构模式,可 ...

  9. Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->关于spring framework中的beans

    Spring framework中的beans 1.概述 bean其实就是各个类实例化后的对象,即objects spring framework的IOC容器所管理的基本单元就是bean spring ...

随机推荐

  1. 18.Odoo产品分析 (二) – 商业板块(10) – 电子商务(2)

    查看Odoo产品分析系列--目录 接上一篇Odoo产品分析 (二) – 商业板块(10) – 电子商务(1) 6. 高级属性 除了我们到目前为止已经覆盖基本选项,Odoo在产品页面还提供了一些高级选项 ...

  2. Android项目实战(五十一):浅谈GreenDao

    比较出名的数据库框架 GreenDao使用步骤: 1.app目录下的build.gradle文件 添加依赖 compile 'org.greenrobot:greendao:3.2.0' 顶部添加插件 ...

  3. Android为TV端助力 doc里面adb连接出现问题的解决方法

    第一保证连接的两边都是有网的 第二  就是网上常说的1.adb kill-server 2.adb start-server 3.adb remount 但是在运行adb remount有可能会提示 ...

  4. NoHttp封装--07 自定义异步任务框架

    MainActivity: public class MainActivity extends Activity implements View.OnClickListener { .... @Ove ...

  5. Android sdk下载找不到support library

    没有android support library下载项. 找了很多资料,发现 android support library 被Google废弃了,不推荐使用.代替使用的是 android supp ...

  6. git 入门教程之版本管理

    版本管理 背景 在上一节中我们已经成功创建版本库并且已经添加test.txt等文件,这一节我们继续讲解如何进行版本控制. 首先我们先查看test.txt 文件有什么内容吧! # 查看文件内容 $ ca ...

  7. 修改minifest使桌面软件支持高dpi

    在VisualStudio中可以很方便的设置manifest以支持高dpi的用户界面.当然也可以手工修改manifest文件来添加对高dpi的支持. QQ在高dpi方面做的尤其差,对高dpi的支持迟迟 ...

  8. Orchard详解--第八篇 拓展模块及引用的预处理

    从上一篇可以看出Orchard在处理拓展模块时主要有两个组件,一个是Folder另一个是Loader,前者用于搜索后者用于加载. 其中Folder一共有三个:Module Folder.Core Fo ...

  9. java最小公倍数与最大公约数

    import java.util.Scanner; /** * Created by Admin on 2017/3/26. */ public class test02 { public stati ...

  10. spring4笔记----“零配置”:spring提供的几个Annotation标注

    @Component  :标注一个普通的Spring Bean类 @Controller    :标注一个控制器组件器 @Service        :标注一个业务逻辑组件器 @Repository ...