在C#开发中,搜索目录并列出文件是常见的文件操作需求,无论是做本地文件管理工具,还是处理批量文件任务,都需要用到相关的实现逻辑,核心依赖System.IO命名空间提供的文件操作类。

基础实现:列出单级目录下的所有文件
如果只是需要列出目标目录下直接包含的文件,不需要遍历子目录,可以使用DirectoryInfo类配合GetFiles方法快速实现,这种方式代码简洁,适合简单的文件列示场景。
using System;
using System.IO;
class Program
{
static void Main()
{
// 指定要搜索的目录路径,这里可以替换为实际需要的路径
string targetDir = @"D:test";
DirectoryInfo dirInfo = new DirectoryInfo(targetDir);
// 判断目录是否存在
if (!dirInfo.Exists)
{
Console.WriteLine("指定的目录不存在");
return;
}
// 获取当前目录下的所有文件,不包含子目录
FileInfo[] files = dirInfo.GetFiles();
Console.WriteLine($"目录 {targetDir} 下的文件列表:");
foreach (FileInfo file in files)
{
// 输出文件名、大小和最后修改时间
Console.WriteLine($"文件名:{file.Name},大小:{file.Length}字节,最后修改时间:{file.LastWriteTime}");
}
}
}
进阶实现:递归搜索所有子目录的文件
实际场景中往往需要搜索目标目录下的所有子目录,列出全部层级的文件,这时候可以通过递归调用或者GetFiles方法的搜索选项参数来实现,两种方式各有适用场景。
方式一:使用GetFiles方法的搜索参数
GetFiles方法支持传入SearchOption枚举参数,设置为SearchOption.AllDirectories就可以直接获取所有子目录的文件,代码更简洁。
using System;
using System.IO;
class Program
{
static void Main()
{
string targetDir = @"D:test";
DirectoryInfo dirInfo = new DirectoryInfo(targetDir);
if (!dirInfo.Exists)
{
Console.WriteLine("指定的目录不存在");
return;
}
// 使用AllDirectories参数递归搜索所有子目录的文件
FileInfo[] allFiles = dirInfo.GetFiles("*", SearchOption.AllDirectories);
Console.WriteLine($"目录 {targetDir} 及其所有子目录下的文件总数:{allFiles.Length}");
foreach (FileInfo file in allFiles)
{
Console.WriteLine($"完整路径:{file.FullName}");
}
}
}
方式二:自定义递归方法实现
如果需要更灵活的控制,比如过滤特定类型的文件、跳过某些子目录,可以自定义递归方法,在遍历过程中添加自定义逻辑。
using System;
using System.IO;
using System.Collections.Generic;
class Program
{
static void Main()
{
string targetDir = @"D:test";
List<FileInfo> allFiles = new List<FileInfo>();
// 调用自定义递归方法收集所有文件
CollectAllFiles(targetDir, allFiles);
Console.WriteLine($"总共找到 {allFiles.Count} 个文件");
foreach (FileInfo file in allFiles)
{
Console.WriteLine(file.FullName);
}
}
static void CollectAllFiles(string currentDir, List<FileInfo> fileList)
{
DirectoryInfo dirInfo = new DirectoryInfo(currentDir);
if (!dirInfo.Exists)
{
return;
}
// 收集当前目录的文件
fileList.AddRange(dirInfo.GetFiles());
// 递归处理所有子目录
foreach (DirectoryInfo subDir in dirInfo.GetDirectories())
{
// 这里可以添加条件跳过不需要搜索的子目录,比如跳过隐藏目录
if ((subDir.Attributes & FileAttributes.Hidden) != FileAttributes.Hidden)
{
CollectAllFiles(subDir.FullName, fileList);
}
}
}
}
实用功能扩展
在实际使用中,我们往往需要对搜索到的文件做进一步过滤或者处理,以下是几个常见的扩展场景实现。
按文件扩展名过滤
如果只需要列出特定类型的文件,比如只找txt文件,可以在获取文件后添加过滤条件,或者直接在GetFiles方法中指定搜索模式。
using System;
using System.IO;
using System.Linq;
class Program
{
static void Main()
{
string targetDir = @"D:test";
DirectoryInfo dirInfo = new DirectoryInfo(targetDir);
// 方式1:使用GetFiles的搜索模式参数,直接搜索txt文件
FileInfo[] txtFiles = dirInfo.GetFiles("*.txt", SearchOption.AllDirectories);
// 方式2:先获取所有文件再按扩展名过滤,适合多条件过滤场景
FileInfo[] allFiles = dirInfo.GetFiles("*", SearchOption.AllDirectories);
FileInfo[] pdfFiles = allFiles.Where(f => f.Extension.Equals(".pdf", StringComparison.OrdinalIgnoreCase)).ToArray();
Console.WriteLine($"找到的txt文件数量:{txtFiles.Length}");
Console.WriteLine($"找到的pdf文件数量:{pdfFiles.Length}");
}
}
处理访问权限异常
在搜索系统目录或者受权限保护的目录时,可能会抛出UnauthorizedAccessException异常,需要在代码中添加异常处理逻辑,避免程序崩溃。
using System;
using System.IO;
class Program
{
static void Main()
{
string targetDir = @"D:test";
try
{
DirectoryInfo dirInfo = new DirectoryInfo(targetDir);
FileInfo[] allFiles = dirInfo.GetFiles("*", SearchOption.AllDirectories);
Console.WriteLine($"找到 {allFiles.Length} 个文件");
}
catch (UnauthorizedAccessException ex)
{
Console.WriteLine($"访问目录权限不足:{ex.Message}");
}
catch (DirectoryNotFoundException ex)
{
Console.WriteLine($"目录不存在:{ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"发生异常:{ex.Message}");
}
}
}
注意事项
- 路径字符串建议使用@前缀的逐字字符串,避免反斜杠需要转义的问题,比如
@"C:test"而不是"C:\test" - 操作文件前一定要先判断目录或者文件是否存在,避免抛出不必要的异常
- 如果处理的目录层级很深或者文件数量很多,递归搜索可能会占用较多内存,可以考虑使用迭代方式替代递归
- 涉及文件操作时尽量添加异常处理,特别是访问用户指定目录的场景,权限问题很常见
C#目录搜索文件列出DirectoryInfoFileInfo修改时间:2026-06-24 05:48:35