C#获取指定文件夹下所有文件的两种方式(使用Directory.GetFiles()和Directory.EnumerateFiles()函数)及其区别
这篇文章我们来看两种C#获取指定文件夹下所有文件的方法,先直观看一下示例代码,然后对这两种方法进行一下说明和对比。
方法一
using System;
namespace demo
{
class Demo
{
static void Main()
{
try
{
string path = "/path";//注意修改
string[] filePathArray = Directory.GetFiles(path);
foreach (var filePath in filePathArray)
{
//filePath是文件绝对路径,想要获取我们平时所说的文件名还要解析一下,比如使用Path.GetFileName()获取
string fileName = Path.GetFileName(filePath);
Console.WriteLine(fileName);
}
}
catch (Exception ex)
{
Console.WriteLine("Exception:{0}", ex.Message);
}
}
}
}
方法二
using System;
namespace demo
{
class Demo
{
static void Main()
{
try
{
string path = "/path";//注意修改
foreach (var filePath in Directory.EnumerateFiles(path))
{
//filePath是文件绝对路径,想要获取我们平时所说的文件名还要解析一下,比如使用Path.GetFileName()获取
string fileName = Path.GetFileName(filePath);
Console.WriteLine(fileName);
}
}
catch (Exception ex)
{
Console.WriteLine("Exception:{0}", ex.Message);
}
}
}
}
这两种方法用到的Directory.GetFiles()
和Directory.EnumerateFiles()
函数都有多种重载版本,可以按照不同的指定条件获取目录下文件,示例中算是最简单的一种,不指定任何条件,就是获取所有文件。
这两种方法看起来很像,其实底层逻辑区别很大,看一下官方文档的解释:
EnumerateFiles和 GetFiles 方法的不同之处如下:使用 EnumerateFiles时,可以在返回整个集合之前开始枚举名称集合。 使用 GetFiles时,必须等待返回整个名称数组,然后才能访问数组。 因此,在使用许多文件和目录时, EnumerateFiles 可以更高效。
未缓存返回的集合;每次调用 GetEnumerator 集合上的 将启动一个新的枚举。
其实从函数名我们也能猜的差不多了,GetFiles
是直接将全部文件加载到内存里,然后才可以访问,EnumerateFiles
是对文件枚举,有了这个解释就基本可以确定猜想了。
所以对这些信息分析之后我们就可以认为,如果文件夹下有大量文件,GetFiles
会出现性能问题,而且还会占用大量内存资源,甚至可能会因为内存溢出而导致程序崩溃,而因为EnumerateFiles
是枚举这些文件,并且不会缓存,所以就可以避免产生和GetFiles
同样的问题,这点需要注意。