两个同属一个命名空间:System.IO,然而Directory 类,提供对目录的静态方法,执行常见的目录操作,如创建、删除、移动、枚举等。不需要实例化,直接调用其静态方法即可。DirectoryInfo 类,代表特定目录,并提供对该目录的详细信息和操作方法。需要先创建 DirectoryInfo 实例,然后通过该实例调用方法和访问属性。
一. Directory类
Directory 类是 目录操作的重要类。提供了许多静态方法,可以方便地进行文件和目录的创建、删除、复制、移动等操作
1. 创建目录
CreateDirectory
Directory.CreateDirectory(string path)
创建指定路径的目录。
- 参数:
• path:目标目录路径。 - 返回值:一个 DirectoryInfo 对象,表示创建的目录。
csharp
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}");
}
}
}
• 结果:
目录已创建: C:\path\to\your\project\newFolder
2. 判断目录是否存在
Exists
Directory.Exists(string path)
检查指定路径的目录是否存在。
- 参数:
• path:目标目录路径。 - 返回值:布尔值,表示目录是否存在。
csharp
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:目标目录路径。 - 返回值:一个字符串数组,包含目录中的文件路径。
csharp
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}");
}
}
}
• 结果:
C:\path\to\your\project\newFolder\file1.txt
C:\path\to\your\project\newFolder\file2.txt
4. 获取目录中所有子目录路径
GetDirectories
Directory.GetDirectories(string path)
获取指定路径目录中的所有子目录路径。
- 参数:
• path:目标目录路径。 - 返回值:一个字符串数组,包含目录中的子目录路径。
csharp
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}");
}
}
}
• 结果:
C:\path\to\your\project\newFolder\subFolder1
C:\path\to\your\project\newFolder\subFolder2
5. 删除目录
Delete
Directory.Delete(string path, bool recursive)
删除指定路径的目录。
- 参数:
• path:要删除的目录路径。 - recursive:是否递归删除目录及其所有内容。
csharp
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:目标目录路径。
csharp
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 对象,表示目录的创建日期和时间。
csharp
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}");
}
}
}
• 结果:
目录创建时间: 2023/10/01 12:34:56
GetCreationTimeUtc
Directory.GetCreationTimeUtc(string path)
获取目录创建的日期和时间,其格式为协调通用时间 (UTC)。
- 参数:
• path:目标目录路径。 - 返回值:一个 DateTime 对象,表示目录的创建日期和时间(UTC)。
csharp
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}");
}
}
}
结果:
目录创建时间 (UTC): 2023/10/01 04:34:56
二. 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
csharp
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 对象。
csharp
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 指示目录是否存在
csharp
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 对象的状态,使其反映最新的文件系统信息。
csharp
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 数组。
csharp
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 对象。
csharp
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:目标目录的完整路径。
csharp
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:布尔值,指示是否删除目录及其所有子目录和文件。
csharp
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 类优点和缺点
优点
- 简单易用:
• 提供静态方法,可以直接调用,无需实例化对象。
• 对于简单的目录操作非常方便快捷。- 性能较好:
• 因为是静态方法,避免了对象创建的开销,对于大量目录操作可能更高效。- 适用于一次性操作:
• 当只需要进行一次性的目录操作(如创建、删除)时,使用 Directory 类更为简洁。
缺点
- 缺乏状态管理:
• 没有状态管理机制,每次操作都需要指定完整的目录路径。
• 不适合需要多次操作同一目录的情况。- 代码可读性较差:
• 对于复杂的目录操作逻辑,使用静态方法可能导致代码难以阅读和维护。- 灵活性有限:
• 功能相对固定,无法像 DirectoryInfo 类那样灵活地扩展和自定义行为。
DirectoryInfo 类优点和缺点
优点
- 面向对象设计:
• 代表具体的目录对象,提供了丰富的属性和方法,便于管理和操作目录。
• 可以存储目录的状态信息,适合多次操作同一个目录的情况。- 易于维护:
• 使用对象的方式组织代码,结构清晰,便于维护和扩展。
• 可以轻松地管理多个目录对象,而不需要重复调用静态方法。- 支持更多的功能:
• 提供了许多高级功能,如目录的创建时间、修改时间、子目录和文件列表等属性。
• 支持递归遍历目录树,灵活性更高。
缺点
- 对象创建开销:
• 需要创建 DirectoryInfo 对象,可能会带来一定的内存和性能开销。
• 在需要频繁创建和销毁目录对象的情况下,可能不如 Directory 类高效。- 复杂度增加:
• 面向对象的设计增加了代码的复杂性,对于简单的目录操作显得有些繁琐。
• 新手可能需要更多的时间来理解和使用 DirectoryInfo 类。- 不适合一次性操作:
• 对于只需要进行一次性的目录操作(如创建、删除),使用 DirectoryInfo 类会显得冗余。
四. 总结
• Directory 类:适用于简单的、一次性目录操作,代码简洁,性能较好。
• DirectoryInfo 类:适用于需要多次操作同一目录或需要访问目录详细信息的情况,代码更具结构性和可维护性。