两个同属一个命名空间:System.IO,然而Directory 类,提供对目录的静态方法,执行常见的目录操作,如创建、删除、移动、枚举等。不需要实例化,直接调用其静态方法即可。DirectoryInfo 类,代表特定目录,并提供对该目录的详细信息和操作方法。需要先创建 DirectoryInfo 实例,然后通过该实例调用方法和访问属性。
一. Directory类
Directory 类是 目录操作的重要类。提供了许多静态方法,可以方便地进行文件和目录的创建、删除、复制、移动等操作
1. 创建目录
CreateDirectory
Directory.CreateDirectory(string path)
创建指定路径的目录。
- 参数:
• path:目标目录路径。 - 返回值:一个 DirectoryInfo 对象,表示创建的目录。
using System;
using System.IO;
class Program
{
static void Main()
{
try
{
DirectoryInfo dirInfo = Directory.CreateDirectory("newFolder");
Console.WriteLine($"目录已创建: {dirInfo.FullName}");
}
catch (Exception ex)
{
Console.WriteLine($"发生错误: {ex.Message}");
}
}
}
• 结果:
2. 判断目录是否存在
Exists
Directory.Exists(string path)
检查指定路径的目录是否存在。
- 参数:
• path:目标目录路径。 - 返回值:布尔值,表示目录是否存在。
using System;
using System.IO;
class Program
{
static void Main()
{
try
{
if (Directory.Exists("newFolder"))
{
Console.WriteLine("目录存在。");
}
else
{
Console.WriteLine("目录不存在。");
}
}
catch (Exception ex)
{
Console.WriteLine($"发生错误: {ex.Message}");
}
}
}
• 结果:
3. 获取目录中所有文件路径
GetFiles
Directory.GetFiles(string path)
获取指定路径目录中的所有文件路径。
- 参数:
• path:目标目录路径。 - 返回值:一个字符串数组,包含目录中的文件路径。
using System;
using System.IO;
class Program
{
static void Main()
{
try
{
string[] files = Directory.GetFiles("newFolder");
foreach (string file in files)
{
Console.WriteLine(file);
}
}
catch (DirectoryNotFoundException ex)
{
Console.WriteLine($"目录未找到: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"发生错误: {ex.Message}");
}
}
}
• 结果:
4. 获取目录中所有子目录路径
GetDirectories
Directory.GetDirectories(string path)
获取指定路径目录中的所有子目录路径。
- 参数:
• path:目标目录路径。 - 返回值:一个字符串数组,包含目录中的子目录路径。
using System;
using System.IO;
class Program
{
static void Main()
{
try
{
string[] subDirectories = Directory.GetDirectories("newFolder");
foreach (string subDirectory in subDirectories)
{
Console.WriteLine(subDirectory);
}
}
catch (DirectoryNotFoundException ex)
{
Console.WriteLine($"目录未找到: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"发生错误: {ex.Message}");
}
}
}
• 结果:
5. 删除目录
Delete
Directory.Delete(string path, bool recursive)
删除指定路径的目录。
- 参数:
• path:要删除的目录路径。 - recursive:是否递归删除目录及其所有内容。
using System;
using System.IO;
class Program
{
static void Main()
{
try
{
Directory.Delete("newFolder", true);
Console.WriteLine("目录已删除。");
}
catch (DirectoryNotFoundException ex)
{
Console.WriteLine($"目录未找到: {ex.Message}");
}
catch (IOException ex)
{
Console.WriteLine($"无法删除目录: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"发生错误: {ex.Message}");
}
}
}
• 结果:
6. 移动目录
Move
Directory.Move(string sourceDirName, string destDirName)
将指定源目录移动到目标位置。
- 参数:
• sourceDirName:源目录路径。
• destDirName:目标目录路径。
using System;
using System.IO;
class Program
{
static void Main()
{
try
{
Directory.Move("sourceFolder", "destinationFolder");
Console.WriteLine("目录已移动。");
}
catch (DirectoryNotFoundException ex)
{
Console.WriteLine($"目录未找到: {ex.Message}");
}
catch (IOException ex)
{
Console.WriteLine($"无法移动目录: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"发生错误: {ex.Message}");
}
}
}
• 结果:
7. 获取目录创建时间
GetCreationTime
Directory.GetCreationTime(string path)
获取目录的创建日期和时间。
- 参数:
• path:目标目录路径。 - 返回值:一个 DateTime 对象,表示目录的创建日期和时间。
using System;
using System.IO;
class Program
{
static void Main()
{
try
{
DateTime creationTime = Directory.GetCreationTime("newFolder");
Console.WriteLine($"目录创建时间: {creationTime}");
}
catch (DirectoryNotFoundException ex)
{
Console.WriteLine($"目录未找到: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"发生错误: {ex.Message}");
}
}
}
• 结果:
GetCreationTimeUtc
Directory.GetCreationTimeUtc(string path)
获取目录创建的日期和时间,其格式为协调通用时间 (UTC)。
- 参数:
• path:目标目录路径。 - 返回值:一个 DateTime 对象,表示目录的创建日期和时间(UTC)。
using System;
using System.IO;
class Program
{
static void Main()
{
try
{
DateTime creationTimeUtc = Directory.GetCreationTimeUtc("newFolder");
Console.WriteLine($"目录创建时间 (UTC): {creationTimeUtc}");
}
catch (DirectoryNotFoundException ex)
{
Console.WriteLine($"目录未找到: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"发生错误: {ex.Message}");
}
}
}
结果:
二. DirectoryInfo 类
DirectoryInfo 常用属性
-
Attributes
:获取或设置目录的属性。
• 类型:FileAttributes -
CreationTime
:获取或设置目录的创建日期和时间。
• 类型:DateTime -
CreationTimeUtc
:获取或设置目录的创建日期和时间(UTC 时间)。
• 类型:DateTime -
Exists
:获取一个值,该值指示目录是否存在。
• 类型:bool -
Extension
:获取表示目录扩展名部分的字符串。对于目录,此属性始终为空字符串。
• 类型:string -
FullName
:获取目录的完整路径。
• 类型:string -
LastAccessTime
:获取或设置目录最后一次被访问的日期和时间。
• 类型:DateTime -
LastAccessTimeUtc
:获取或设置目录最后一次被访问的日期和时间(UTC 时间)。
• 类型:DateTime -
LastWriteTime
:获取或设置目录最后一次写入的时间。
• 类型:DateTime -
LastWriteTimeUtc
:获取或设置目录最后一次写入的时间(UTC 时间)。
• 类型:DateTime -
Name
:获取目录的名称。
• 类型:string -
Parent
:获取父目录的 DirectoryInfo 对象。
• 类型:DirectoryInfo -
Root
:获取目录的根部分。
• 类型:DirectoryInfo
using System;
using System.IO;
class Program
{
static void Main()
{
string directoryPath = @"C:\MyFolder";
try
{
DirectoryInfo dirInfo = new DirectoryInfo(directoryPath);
// 检查目录是否存在
if (dirInfo.Exists)
{
// 输出目录的各种属性
Console.WriteLine($"目录名称: {dirInfo.Name}");
Console.WriteLine($"目录完整路径: {dirInfo.FullName}");
Console.WriteLine($"目录存在: {dirInfo.Exists}");
Console.WriteLine($"目录创建时间: {dirInfo.CreationTime}");
Console.WriteLine($"目录最后访问时间: {dirInfo.LastAccessTime}");
Console.WriteLine($"目录最后写入时间: {dirInfo.LastWriteTime}");
Console.WriteLine($"目录属性: {dirInfo.Attributes}");
Console.WriteLine($"目录扩展名: {dirInfo.Extension}"); // 总是空字符串
// 获取父目录
DirectoryInfo parentDir = dirInfo.Parent;
if (parentDir != null)
{
Console.WriteLine($"父目录名称: {parentDir.Name}");
}
// 获取根目录
DirectoryInfo rootDir = dirInfo.Root;
Console.WriteLine($"根目录: {rootDir.FullName}");
}
else
{
Console.WriteLine("目录不存在。");
}
}
catch (IOException ex)
{
Console.WriteLine($"IO 错误: {ex.Message}");
}
catch (UnauthorizedAccessException ex)
{
Console.WriteLine($"无权限访问目录: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"发生错误: {ex.Message}");
}
}
}
DirectoryInfo 常用方法
-
Create()
:创建目录。
• 返回值:当前的 DirectoryInfo 实例。 -
Delete(bool recursive)
:删除目录及其内容。
参数:
• recursive: 如果为 true,则递归删除目录及其所有子目录和文件;如果为 false,则仅删除空目录。 -
GetDirectories(string searchPattern, SearchOption searchOption)
:检索匹配指定搜索模式的子目录。
参数:
• searchPattern: 要匹配的搜索字符串。
• searchOption: 指定是否应包括所有子目录。
• 返回值:DirectoryInfo 数组。
• 说明:可以根据需要指定不同的搜索模式和搜索选项。 -
GetFiles(string searchPattern, SearchOption searchOption)
:检索匹配指定搜索模式的文件。
• 参数:
• searchPattern: 要匹配的搜索字符串。
• searchOption: 指定是否应包括所有子目录。
• 返回值:FileInfo 数组。
• 说明:可以根据需要指定不同的搜索模式和搜索选项。 -
MoveTo(string destDirName)
:将目录及其内容移动到新位置。
• 参数:
• destDirName: 目标目录的完整路径。
• 返回值:无。
• 说明:如果目标目录已经存在,则会抛出异常。 -
Refresh()
:刷新当前实例的状态,使其反映最新更改。
• 返回值:无。
• 说明:在对目录进行某些操作后,调用此方法可以确保对象的状态是最新的。 -
ToString()
:返回表示当前对象的字符串。
• 返回值:目录的完整路径。
• 说明:通常用于调试或日志记录。 -
CreateSubdirectory(string path)
:在当前目录中创建子目录。
• 参数:
• path: 子目录的相对路径。
• 返回值:新创建的 DirectoryInfo 对象。
• 说明:如果子目录已经存在,则不会抛出异常。 -
GetFileSystemInfos(string searchPattern, SearchOption searchOption)
:检索匹配指定搜索模式的所有文件和子目录。
• 参数:
• searchPattern: 要匹配的搜索字符串。
• searchOption: 指定是否应包括所有子目录。
• 返回值:FileSystemInfo 数组。
• 说明:返回的数组包含 FileInfo 和 DirectoryInfo 对象。 -
GetLogicalDrives()
:获取计算机上的逻辑驱动器。
• 返回值:字符串数组,其中每个元素都是一个逻辑驱动器的名称。
• 说明:这是一个静态方法,不需要实例化 DirectoryInfo 对象即可调用。
1. 创建目标目录
Create()创建目录。返回值:当前的 DirectoryInfo 对象。
using System;
using System.IO;
class Program
{
static void Main()
{
string targetPath = @"D:\TargetFolder";
CreateTargetDirectory(targetPath);
}
static void CreateTargetDirectory(string path)
{
try
{
DirectoryInfo targetDir = new DirectoryInfo(path);
if (!targetDir.Exists)
{
targetDir.Create();
Console.WriteLine($"目标目录已创建: {targetDir.FullName}");
}
}
catch (IOException ex)
{
Console.WriteLine($"创建目标目录时发生 IO 错误: {ex.Message}");
}
catch (UnauthorizedAccessException ex)
{
Console.WriteLine($"创建目标目录时无权限访问: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"创建目标目录时发生未知错误: {ex.Message}");
}
}
}
2.判断目录是否存在
Exists 指示目录是否存在
using System;
using System.IO;
class Program
{
static void Main()
{
string targetPath = @"D:\TargetFolder";
string searchPattern = "*.txt";
string subDirName = "Logs";
try
{
// 创建 DirectoryInfo 对象
DirectoryInfo targetDir = new DirectoryInfo(targetPath);
// 创建目标目录(如果不存在)
if (!targetDir.Exists)
{
Console.WriteLine($"目录存在");
}else{
Console.WriteLine($"目录不存在");
}
}
}
3. 刷新源目录信息
Refresh()刷新 DirectoryInfo 对象的状态,使其反映最新的文件系统信息。
using System;
using System.IO;
class Program
{
static void Main()
{
string sourcePath = @"C:\SourceFolder";
RefreshSourceDirectory(sourcePath);
}
static void RefreshSourceDirectory(string path)
{
try
{
DirectoryInfo sourceDir = new DirectoryInfo(path);
sourceDir.Refresh();
}
catch (IOException ex)
{
Console.WriteLine($"刷新源目录信息时发生 IO 错误: {ex.Message}");
}
catch (UnauthorizedAccessException ex)
{
Console.WriteLine($"刷新源目录信息时无权限访问: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"刷新源目录信息时发生未知错误: {ex.Message}");
}
}
}
4. 获取源目录中的文本文件
GetFiles(string searchPattern, SearchOption searchOption)获取目录中匹配指定模式的文件。
- 参数:
• searchPattern:字符串,指定搜索模式(例如 “*.txt”)。
• searchOption:SearchOption 枚举,指定搜索选项(TopDirectoryOnly 或 AllDirectories)。 - 返回值:FileInfo 数组。
using System;
using System.IO;
class Program
{
static void Main()
{
string sourcePath = @"C:\SourceFolder";
string searchPattern = "*.txt";
GetTextFilesInSourceDirectory(sourcePath, searchPattern);
}
static void GetTextFilesInSourceDirectory(string path, string searchPattern)
{
try
{
DirectoryInfo sourceDir = new DirectoryInfo(path);
FileInfo[] textFiles = sourceDir.GetFiles(searchPattern, SearchOption.AllDirectories);
Console.WriteLine($"找到 {textFiles.Length} 个文本文件:");
foreach (FileInfo file in textFiles)
{
Console.WriteLine(file.FullName);
}
}
catch (IOException ex)
{
Console.WriteLine($"获取文件时发生 IO 错误: {ex.Message}");
}
catch (UnauthorizedAccessException ex)
{
Console.WriteLine($"获取文件时无权限访问: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"获取文件时发生未知错误: {ex.Message}");
}
}
}
5. 在源目录中创建子目录
CreateSubdirectory(string path)在当前目录中创建一个子目录。
- 参数:
• path:子目录的名称或相对路径。 - 返回值:新创建的 DirectoryInfo 对象。
using System;
using System.IO;
class Program
{
static void Main()
{
string sourcePath = @"C:\SourceFolder";
string subDirName = "Logs";
CreateSubdirectoryInSourceDirectory(sourcePath, subDirName);
}
static void CreateSubdirectoryInSourceDirectory(string path, string subDirName)
{
try
{
DirectoryInfo sourceDir = new DirectoryInfo(path);
DirectoryInfo logDir = sourceDir.CreateSubdirectory(subDirName);
Console.WriteLine($"子目录已创建: {logDir.FullName}");
}
catch (IOException ex)
{
Console.WriteLine($"创建子目录时发生 IO 错误: {ex.Message}");
}
catch (UnauthorizedAccessException ex)
{
Console.WriteLine($"创建子目录时无权限访问: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"创建子目录时发生未知错误: {ex.Message}");
}
}
}
6. 将源目录移动到目标目录
MoveTo(string destDirName)将目录移动到新位置。
- 参数:
• destDirName:目标目录的完整路径。
using System;
using System.IO;
class Program
{
static void Main()
{
string sourcePath = @"C:\SourceFolder";
string targetPath = @"D:\TargetFolder";
MoveSourceDirectory(sourcePath, targetPath);
}
static void MoveSourceDirectory(string sourcePath, string targetPath)
{
try
{
DirectoryInfo sourceDir = new DirectoryInfo(sourcePath);
if (sourceDir.Exists)
{
sourceDir.MoveTo(targetPath + "\\" + sourceDir.Name);
Console.WriteLine($"源目录已移动到: {targetPath}\\{sourceDir.Name}");
}
}
catch (IOException ex)
{
Console.WriteLine($"移动目录时发生 IO 错误: {ex.Message}");
}
catch (UnauthorizedAccessException ex)
{
Console.WriteLine($"移动目录时无权限访问: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"移动目录时发生未知错误: {ex.Message}");
}
}
}
7. 删除目标目录及其所有内容
Delete(bool recursive)删除目录及其内容。
- 参数:
• recursive:布尔值,指示是否删除目录及其所有子目录和文件。
using System;
using System.IO;
class Program
{
static void Main()
{
string targetPath = @"D:\TargetFolder";
DeleteTargetDirectory(targetPath);
}
static void DeleteTargetDirectory(string path)
{
try
{
DirectoryInfo targetDir = new DirectoryInfo(path);
if (targetDir.Exists)
{
targetDir.Delete(true);
Console.WriteLine("目标目录已删除。");
}
}
catch (IOException ex)
{
Console.WriteLine($"删除目录时发生 IO 错误: {ex.Message}");
}
catch (UnauthorizedAccessException ex)
{
Console.WriteLine($"删除目录时无权限访问: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"删除目录时发生未知错误: {ex.Message}");
}
}
}
三. Directory类与DirectoryInfo 类优缺点对比
Directory 类优点和缺点
优点
缺点
DirectoryInfo 类优点和缺点
优点
缺点
四. 总结
• Directory 类:适用于简单的、一次性目录操作,代码简洁,性能较好。
• DirectoryInfo 类:适用于需要多次操作同一目录或需要访问目录详细信息的情况,代码更具结构性和可维护性。