在C#开发过程中,获取指定文件夹下的所有文件是极为常见的需求,比如批量处理文档、统计文件数量、筛选特定类型文件等场景都需要用到该功能,下面介绍几种常用的实现方式。

使用Directory类的静态方法
Directory类提供了多个静态方法用于操作文件系统,其中GetFiles方法可以直接获取指定目录下的文件列表,使用起来非常简单。
获取当前目录下的所有文件
如果只需要获取目标文件夹根目录下的文件,不需要遍历子文件夹,可以使用以下代码:
using System;
using System.IO;
class Program
{
static void Main()
{
string folderPath = @"D:test";
// 获取指定目录下的所有文件,返回字符串数组
string[] files = Directory.GetFiles(folderPath);
foreach (string file in files)
{
Console.WriteLine(file);
}
}
}
获取包含子目录的所有文件
如果需要同时获取目标文件夹下所有子文件夹中的文件,可以给GetFiles方法传入SearchOption.AllDirectories参数:
using System;
using System.IO;
class Program
{
static void Main()
{
string folderPath = @"D:test";
// 搜索所有子目录下的文件
string[] allFiles = Directory.GetFiles(folderPath, "*", SearchOption.AllDirectories);
foreach (string file in allFiles)
{
Console.WriteLine(file);
}
}
}
筛选特定类型的文件
GetFiles方法支持传入搜索模式参数,用来筛选特定扩展名的文件,比如只获取txt文件:
using System;
using System.IO;
class Program
{
static void Main()
{
string folderPath = @"D:test";
// 只获取txt文件,包含子目录
string[] txtFiles = Directory.GetFiles(folderPath, "*.txt", SearchOption.AllDirectories);
Console.WriteLine($"找到{txtFiles.Length}个txt文件");
}
}
使用DirectoryInfo类的实例方法
DirectoryInfo是面向对象的文件系统操作类,需要先创建实例,它的GetFiles方法返回的是FileInfo对象数组,可以获取更多文件属性信息。
基础获取文件列表
使用DirectoryInfo获取根目录文件的方式如下:
using System;
using System.IO;
class Program
{
static void Main()
{
DirectoryInfo dirInfo = new DirectoryInfo(@"D:test");
// 获取当前目录下的所有文件,返回FileInfo数组
FileInfo[] files = dirInfo.GetFiles();
foreach (FileInfo file in files)
{
// 可以获取文件名、大小、创建时间等信息
Console.WriteLine($"文件名:{file.Name},大小:{file.Length}字节,创建时间:{file.CreationTime}");
}
}
}
递归获取所有子目录文件
DirectoryInfo本身也支持传入搜索选项获取所有子目录文件,不需要手动写递归逻辑:
using System;
using System.IO;
class Program
{
static void Main()
{
DirectoryInfo dirInfo = new DirectoryInfo(@"D:test");
// 获取所有子目录下的文件
FileInfo[] allFiles = dirInfo.GetFiles("*", SearchOption.AllDirectories);
foreach (FileInfo file in allFiles)
{
Console.WriteLine(file.FullName);
}
}
}
手动实现递归遍历(自定义控制场景)
如果需要更灵活的控制,比如跳过某些特定子目录,可以手动实现递归遍历逻辑:
using System;
using System.IO;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<FileInfo> allFiles = new List<FileInfo>();
DirectoryInfo rootDir = new DirectoryInfo(@"D:test");
GetAllFiles(rootDir, allFiles);
Console.WriteLine($"总共找到{allFiles.Count}个文件");
}
static void GetAllFiles(DirectoryInfo dir, List<FileInfo> fileList)
{
try
{
// 先获取当前目录的文件
fileList.AddRange(dir.GetFiles());
// 遍历子目录递归获取
foreach (DirectoryInfo subDir in dir.GetDirectories())
{
// 这里可以添加条件跳过不需要遍历的目录
GetAllFiles(subDir, fileList);
}
}
catch (UnauthorizedAccessException)
{
// 处理没有权限访问的目录
Console.WriteLine($"没有权限访问目录:{dir.FullName}");
}
}
}
两种方式的对比与注意事项
Directory类的静态方法使用更简单,适合简单的文件获取场景;DirectoryInfo类返回的是FileInfo对象,可以获取更多文件元数据,适合需要对文件属性做进一步处理的场景。
需要注意以下几点:
- 传入的文件夹路径必须存在,否则会抛出
DirectoryNotFoundException异常,建议先使用Directory.Exists判断路径是否存在 - 遍历过程中如果遇到没有权限访问的目录,会抛出
UnauthorizedAccessException异常,需要做好异常处理 - 如果文件夹下的文件数量非常多,一次性加载所有文件可能会占用较多内存,可根据实际需求分批处理
- 路径字符串可以使用相对路径或者绝对路径,相对路径是相对于程序运行目录的
常见异常处理示例
在实际开发中,为了避免程序崩溃,需要给文件遍历代码添加异常处理:
using System;
using System.IO;
class Program
{
static void Main()
{
string folderPath = @"D:test";
if (!Directory.Exists(folderPath))
{
Console.WriteLine("指定的文件夹不存在");
return;
}
try
{
string[] files = Directory.GetFiles(folderPath, "*", SearchOption.AllDirectories);
foreach (string file in files)
{
Console.WriteLine(file);
}
}
catch (UnauthorizedAccessException ex)
{
Console.WriteLine($"访问文件时发生权限错误:{ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"发生未知错误:{ex.Message}");
}
}
}
C#DirectoryInfoGetFilesFileInfo递归遍历修改时间:2026-06-20 21:39:35