C#高效文件操作揭秘:Directory.EnumerateFiles如何让你秒速遍历目录?
你是否曾因遍历大量文件而苦恼于效率低下?是否曾在等待文件处理完成时感到时间漫长?今天,我要为你揭示C#中一个强大的文件操作工具——Directory.EnumerateFiles方法,它如何助你秒速遍历目录,轻松解决文件处理难题!
在C#中,Directory.EnumerateFiles方法用于枚举指定目录及其子目录中与搜索模式匹配的文件。与传统的Directory.GetFiles方法相比,EnumerateFiles方法以延迟执行的方式返回文件信息,这意味着它不会一次性加载所有文件到内存中,而是逐个返回,极大地提高了处理大量文件时的效率。
下面是一个使用Directory.EnumerateFiles方法的示例代码:
class Program
{
public static string LogPath = @"F:\WebSite1\LogFiles000\";
static async Task Main(string[] args)
{
var stopwatch = System.Diagnostics.Stopwatch.StartNew();
// 使用 EnumerateFiles 遍历文件
var files = Directory.EnumerateFiles(LogPath, "*.*", SearchOption.AllDirectories);
// 记录遍历时间
double enumerationTime = stopwatch.Elapsed.TotalMilliseconds;
stopwatch.Restart();
// 假设我们要对每个文件进行处理,如复制到另一个目录
foreach (var file in files)
{
FileInfo fileInfo = new FileInfo(file);
// 这里使用异步写入来模拟文件处理操作
await CopyFileAsync(file, @"E:\测试保存\" + Guid.NewGuid() + fileInfo.Name);
}
// 记录总处理时间
double totalTime = stopwatch.Elapsed.TotalMilliseconds;
Console.WriteLine("遍历时间:" + enumerationTime + "ms, 总处理时间:" + totalTime + "ms");
stopwatch.Stop();
}
static async Task CopyFileAsync(string sourceFile, string destinationFile)
{
using (var sourceStream = new FileStream(sourceFile, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize: 4096, useAsync: true))
using (var destinationStream = new FileStream(destinationFile, FileMode.Create, FileAccess.Write, FileShare.None, bufferSize: 4096, useAsync: true))
{
await sourceStream.CopyToAsync(destinationStream);
}
}
}
首先使用Directory.EnumerateFiles方法遍历指定目录下的所有文件,并记录遍历时间。然后,我们通过一个异步方法CopyFileAsync模拟对每个文件的处理操作(这里简化为文件复制)。最终,我们记录了总处理时间。通过这种方法,你可以清楚地看到Directory.EnumerateFiles方法在处理大量文件时的高效性。