在C#的开发场景中,目录的创建、删除、查询以及目录下文件的遍历是非常基础且常用的操作,.NET框架为我们提供了Directory和DirectoryInfo两个核心类来处理这类需求,二者适用场景不同,掌握它们的用法能大幅提升开发效率。

Directory和DirectoryInfo的核心区别
Directory是静态类,所有方法都通过类名直接调用,不需要创建实例,适合执行单次、简单的目录操作,比如快速判断某个目录是否存在、创建临时目录等。DirectoryInfo是实例类,需要先实例化一个对应目录的对象,再调用对象的方法,适合需要对同一个目录执行多次操作的场景,比如先判断目录是否存在,再获取目录下的所有文件,再遍历文件属性等。
Directory常用方法示例
判断目录是否存在
使用Directory.Exists方法可以判断指定路径的目录是否存在,返回值为布尔类型。
using System;
using System.IO;
class Program
{
static void Main()
{
string dirPath = @"D:TestDir";
// 判断目录是否存在
bool isExist = Directory.Exists(dirPath);
Console.WriteLine($"目录是否存在:{isExist}");
}
}
创建目录
使用Directory.CreateDirectory方法可以创建目录,如果目录已经存在,该方法不会抛出异常,也不会重复创建。
using System;
using System.IO;
class Program
{
static void Main()
{
string dirPath = @"D:TestDirSubDir";
// 创建目录,支持多级目录创建
Directory.CreateDirectory(dirPath);
Console.WriteLine("目录创建完成");
}
}
删除目录
Directory.Delete方法有两个重载,一个只接收目录路径,只能删除空目录;另一个接收目录路径和布尔值,当布尔值为true时,可以递归删除目录及其所有子目录和文件。
using System;
using System.IO;
class Program
{
static void Main()
{
string dirPath = @"D:TestDirSubDir";
// 递归删除目录及所有内容
Directory.Delete(dirPath, true);
Console.WriteLine("目录删除完成");
}
}
获取目录下的文件
使用Directory.GetFiles方法可以获取指定目录下的所有文件路径,支持传入搜索模式过滤文件。
using System;
using System.IO;
class Program
{
static void Main()
{
string dirPath = @"D:TestDir";
// 获取目录下所有txt文件
string[] txtFiles = Directory.GetFiles(dirPath, "*.txt");
foreach (string filePath in txtFiles)
{
Console.WriteLine(filePath);
}
}
}
DirectoryInfo常用方法示例
实例化DirectoryInfo对象
需要先传入目录路径创建DirectoryInfo实例,之后就可以通过实例访问目录的相关属性和方法。
using System;
using System.IO;
class Program
{
static void Main()
{
string dirPath = @"D:TestDir";
DirectoryInfo dirInfo = new DirectoryInfo(dirPath);
// 判断实例对应的目录是否存在
Console.WriteLine($"目录是否存在:{dirInfo.Exists}");
}
}
获取目录下的子目录和文件
DirectoryInfo实例的GetDirectories方法可以获取所有子目录,GetFiles方法可以获取所有文件,这两个方法都支持传入搜索模式进行过滤。
using System;
using System.IO;
class Program
{
static void Main()
{
string dirPath = @"D:TestDir";
DirectoryInfo dirInfo = new DirectoryInfo(dirPath);
// 获取所有子目录
DirectoryInfo[] subDirs = dirInfo.GetDirectories();
Console.WriteLine("子目录列表:");
foreach (DirectoryInfo subDir in subDirs)
{
Console.WriteLine(subDir.Name);
}
// 获取所有jpg文件
FileInfo[] jpgFiles = dirInfo.GetFiles("*.jpg");
Console.WriteLine("JPG文件列表:");
foreach (FileInfo file in jpgFiles)
{
Console.WriteLine(file.Name);
}
}
}
完整文件遍历示例
下面是通过DirectoryInfo递归遍历某个目录下所有文件(包括所有子目录中的文件)的完整示例,会输出每个文件的完整路径和大小。
using System;
using System.IO;
class Program
{
static void Main()
{
string rootDir = @"D:TestDir";
TraverseDirectory(rootDir);
}
/// <summary>
/// 递归遍历目录下的所有文件
/// </summary>
/// <param name="dirPath">要遍历的目录路径</param>
static void TraverseDirectory(string dirPath)
{
DirectoryInfo dirInfo = new DirectoryInfo(dirPath);
if (!dirInfo.Exists)
{
Console.WriteLine($"目录{dirPath}不存在");
return;
}
// 处理当前目录下的所有文件
FileInfo[] files = dirInfo.GetFiles();
foreach (FileInfo file in files)
{
Console.WriteLine($"文件路径:{file.FullName},文件大小:{file.Length}字节");
}
// 递归处理子目录
DirectoryInfo[] subDirs = dirInfo.GetDirectories();
foreach (DirectoryInfo subDir in subDirs)
{
TraverseDirectory(subDir.FullName);
}
}
}
使用注意事项
- 操作目录时需要确保程序有足够的权限,否则会抛出UnauthorizedAccessException异常。
- 路径字符串建议使用@前缀的逐字字符串,避免转义字符带来的问题,比如@"D:TestDir"而不是"D:\TestDir"。
- 使用Directory.Delete递归删除目录时要谨慎,避免误删重要数据,建议删除前先确认目录路径是否正确。
- 如果需要多次操作同一个目录,优先使用DirectoryInfo,避免重复构造路径和重复判断,性能更好。
C#DirectoryDirectoryInfo目录操作文件遍历修改时间:2026-06-11 05:24:35