在C#开发中,遍历文件夹中的所有文件并列出目录下的文件是文件操作场景中的常见需求,无论是批量处理文件、统计文件信息还是实现文件搜索功能,都需要用到相关的实现方法。C#提供了多个类来支持文件和目录的操作,不同的实现方式适用于不同的场景,开发者可以根据实际需求选择合适的方法。

C#遍历文件的核心类介绍
C#中处理目录和文件的核心类主要位于System.IO命名空间下,其中Directory类和DirectoryInfo类是遍历目录的主要工具,两者各有特点:
Directory类是静态类,提供了静态方法来操作目录,使用起来比较简洁,不需要创建实例,适合快速执行简单的目录操作。DirectoryInfo类是实例类,需要创建实例对象来使用,它提供了更多实例属性和方法,适合需要多次操作同一个目录的场景,性能相对更好。
基础遍历:列出指定目录下的所有文件
使用Directory静态类实现
Directory类的GetFiles方法可以直接获取指定目录下的所有文件路径,是最简单的遍历方式,该方法有多个重载,支持指定搜索模式和搜索选项。
下面是使用Directory.GetFiles列出目录下所有文件的示例代码:
using System;
using System.IO;
class Program
{
static void Main()
{
// 指定要遍历的目录路径
string targetDirectory = @"C:TestFolder";
try
{
// 获取目录下所有文件的路径数组
string[] allFiles = Directory.GetFiles(targetDirectory);
Console.WriteLine($"目录 {targetDirectory} 下的所有文件:");
foreach (string filePath in allFiles)
{
// 输出文件路径
Console.WriteLine(filePath);
// 可以获取文件信息,比如文件名
string fileName = Path.GetFileName(filePath);
Console.WriteLine($"文件名:{fileName}");
}
}
catch (Exception ex)
{
// 处理异常,比如目录不存在、无访问权限等
Console.WriteLine($"遍历文件时出现错误:{ex.Message}");
}
}
}
使用DirectoryInfo实例类实现
DirectoryInfo类的GetFiles方法返回的是FileInfo对象数组,相比直接返回路径字符串,FileInfo对象包含了文件的更多属性,比如文件大小、创建时间、修改时间等,方便后续处理文件信息。
下面是使用DirectoryInfo列出目录下所有文件的示例代码:
using System;
using System.IO;
class Program
{
static void Main()
{
string targetDirectory = @"C:TestFolder";
try
{
DirectoryInfo dirInfo = new DirectoryInfo(targetDirectory);
// 判断目录是否存在
if (!dirInfo.Exists)
{
Console.WriteLine("指定的目录不存在");
return;
}
// 获取目录下所有文件的FileInfo对象数组
FileInfo[] allFiles = dirInfo.GetFiles();
Console.WriteLine($"目录 {targetDirectory} 下的所有文件信息:");
foreach (FileInfo file in allFiles)
{
Console.WriteLine($"文件名:{file.Name}");
Console.WriteLine($"文件路径:{file.FullName}");
Console.WriteLine($"文件大小:{file.Length} 字节");
Console.WriteLine($"创建时间:{file.CreationTime}");
Console.WriteLine("------------------------");
}
}
catch (Exception ex)
{
Console.WriteLine($"遍历文件时出现错误:{ex.Message}");
}
}
}
进阶遍历:包含子文件夹的所有文件
上面的方法只能遍历指定目录下的直接文件,不会包含子文件夹中的文件,如果需要遍历目录下所有层级的子文件夹中的文件,有两种常用实现方式:使用搜索选项参数、递归遍历。
使用搜索选项参数实现
Directory.GetFiles和DirectoryInfo.GetFiles都提供了重载方法,支持传入SearchOption枚举参数,当参数设置为SearchOption.AllDirectories时,会自动遍历所有子目录下的文件。
下面是使用Directory.GetFiles带搜索选项参数的示例代码:
using System;
using System.IO;
class Program
{
static void Main()
{
string targetDirectory = @"C:TestFolder";
try
{
// SearchOption.AllDirectories 表示遍历所有子目录
string[] allFiles = Directory.GetFiles(targetDirectory, "*", SearchOption.AllDirectories);
Console.WriteLine($"目录 {targetDirectory} 及其所有子目录下的文件总数:{allFiles.Length}");
foreach (string filePath in allFiles)
{
Console.WriteLine(filePath);
}
}
catch (UnauthorizedAccessException ex)
{
// 处理无访问权限的异常,部分子目录可能没有访问权限
Console.WriteLine($"访问部分目录权限不足:{ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"遍历文件时出现错误:{ex.Message}");
}
}
}
递归遍历实现
如果需要更灵活的控制遍历过程,比如过滤特定类型的文件、跳过某些子目录,可以使用递归的方式手动遍历每个子目录。递归遍历的核心逻辑是先处理当前目录的文件,再遍历当前目录下的所有子目录,对每个子目录重复执行相同的操作。
下面是递归遍历目录下所有文件的示例代码:
using System;
using System.IO;
class Program
{
static void Main()
{
string targetDirectory = @"C:TestFolder";
TraverseDirectory(targetDirectory);
}
/// <summary>
/// 递归遍历目录及其所有子目录下的文件
/// </summary>
/// <param name="currentDir">当前要遍历的目录路径</param>
static void TraverseDirectory(string currentDir)
{
try
{
// 先遍历当前目录下的所有文件
string[] files = Directory.GetFiles(currentDir);
foreach (string filePath in files)
{
Console.WriteLine(filePath);
}
// 再获取当前目录下的所有子目录
string[] subDirs = Directory.GetDirectories(currentDir);
foreach (string subDir in subDirs)
{
// 递归遍历子目录
TraverseDirectory(subDir);
}
}
catch (UnauthorizedAccessException)
{
// 跳过无访问权限的目录
Console.WriteLine($"跳过无权限访问的目录:{currentDir}");
}
catch (Exception ex)
{
Console.WriteLine($"遍历目录 {currentDir} 时出现错误:{ex.Message}");
}
}
}
不同遍历方式的对比和注意事项
不同的遍历方式有不同的适用场景,开发者可以根据实际需求选择:
| 实现方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| Directory.GetFiles 基础用法 | 代码简洁,使用简单 | 只能获取直接文件,返回的是路径字符串,信息较少 | 快速获取指定目录下的直接文件路径 |
| DirectoryInfo.GetFiles 基础用法 | 返回FileInfo对象,包含丰富的文件属性 | 只能获取直接文件,需要创建实例 | 需要获取文件详细信息,多次操作同一目录 |
| 带SearchOption.AllDirectories参数 | 代码简洁,自动遍历所有子目录 | 遇到无权限目录会直接抛异常,灵活性较差 | 确定所有子目录都有访问权限,快速遍历所有文件 |
| 递归遍历 | 灵活性高,可以自定义过滤规则,处理异常目录 | 代码相对复杂,深层目录可能存在栈溢出风险 | 需要自定义遍历规则,处理权限不足的目录 |
在使用遍历功能时,需要注意以下几点:
- 操作前一定要判断目录是否存在,避免抛出目录不存在的异常。
- 遍历过程中可能会遇到无访问权限的目录,需要做好异常处理,避免程序崩溃。
- 如果目录下的文件数量非常多,一次性获取所有文件可能会占用大量内存,可以考虑使用枚举器的方式逐批处理,不过C#的
GetFiles方法暂不支持,这种场景可以考虑使用递归配合分批处理。 - 路径字符串建议使用绝对路径,避免相对路径带来的路径解析错误问题。
常见需求扩展:过滤特定类型的文件
在实际开发中,经常需要只遍历特定类型的文件,比如只获取所有的txt文件或者jpg图片文件,这时候可以使用GetFiles方法的搜索模式参数,搜索模式支持使用通配符*和?。
下面是只遍历目录下所有txt文件的示例代码:
using System;
using System.IO;
class Program
{
static void Main()
{
string targetDirectory = @"C:TestFolder";
try
{
// 搜索模式为*.txt,表示所有后缀为txt的文件
string[] txtFiles = Directory.GetFiles(targetDirectory, "*.txt", SearchOption.AllDirectories);
Console.WriteLine($"目录下的所有txt文件:");
foreach (string filePath in txtFiles)
{
Console.WriteLine(filePath);
}
}
catch (Exception ex)
{
Console.WriteLine($"遍历文件时出现错误:{ex.Message}");
}
}
}
如果过滤规则比较复杂,比如需要同时获取txt和jpg文件,或者根据文件大小、创建时间过滤,可以在获取到所有文件后,使用LINQ进行二次过滤,满足更复杂的业务需求。
C#遍历文件夹列出文件DirectoryInfoFileInfo修改时间:2026-07-17 15:24:44