ZetCode

C# DirectoryInfo

最后修改于 2025 年 4 月 20 日

本教程介绍如何在 C# 中使用 DirectoryInfo 类来执行目录操作。 DirectoryInfo 提供了创建、移动和枚举目录的方法。

DirectoryInfo 类公开了用于创建、移动和枚举目录和子目录的实例方法。 它提供了比静态 Directory 类更多的功能。

当您需要对同一目录执行多个操作时,DirectoryInfo 非常有用。 它缓存有关目录的信息,从而提高重复操作的性能。

创建 DirectoryInfo 实例

此示例演示如何创建 DirectoryInfo 实例并检查目录是否存在。 DirectoryInfo 构造函数接受目录路径。

Program.cs
using System;
using System.IO;

class Program
{
    static void Main()
    {
        string path = @"C:\Temp\TestDirectory";
        DirectoryInfo dirInfo = new DirectoryInfo(path);
        
        if (dirInfo.Exists)
        {
            Console.WriteLine($"Directory '{path}' already exists.");
        }
        else
        {
            Console.WriteLine($"Directory '{path}' does not exist.");
        }
    }
}

该代码为指定的路径创建一个 DirectoryInfo 实例。 然后,它使用 Exists 属性检查目录是否存在。 DirectoryInfo 构造函数接受一个字符串,表示目录的路径。

如果目录存在,则 Exists 属性返回 true,否则返回 false。 此示例显示了初始化 DirectoryInfo 和检查目录存在性的基本方法。 请注意,该路径使用 @ 逐字字符串文字来避免转义反斜杠。

创建和删除目录

此示例演示如何使用 DirectoryInfo 创建和删除目录。 Create 和 Delete 方法处理这些操作。

Program.cs
using System;
using System.IO;

class Program
{
    static void Main()
    {
        string path = @"C:\Temp\NewDirectory";
        DirectoryInfo dirInfo = new DirectoryInfo(path);
        
        if (!dirInfo.Exists)
        {
            dirInfo.Create();
            Console.WriteLine($"Directory '{path}' created successfully.");
        }
        
        // Perform operations on the directory
        
        dirInfo.Delete();
        Console.WriteLine($"Directory '{path}' deleted successfully.");
    }
}

Create 方法在指定路径创建一个新目录。 Delete 方法删除该目录。 该示例首先使用 Exists 属性检查目录是否存在。 如果不存在,它使用 Create 方法创建该目录。

在执行任何需要的操作后,它使用 Delete 方法删除该目录。 请注意,如果目录不存在或不为空,Delete 将抛出异常。 对于非空目录,请使用 Delete(true) 进行递归删除。

获取目录属性

DirectoryInfo 提供了访问目录信息的属性。 此示例演示如何检索各种目录属性。

Program.cs
using System;
using System.IO;

class Program
{
    static void Main()
    {
        DirectoryInfo dirInfo = new DirectoryInfo(@"C:\Temp");
        
        Console.WriteLine($"Full Name: {dirInfo.FullName}");
        Console.WriteLine($"Name: {dirInfo.Name}");
        Console.WriteLine($"Parent: {dirInfo.Parent}");
        Console.WriteLine($"Root: {dirInfo.Root}");
        Console.WriteLine($"Creation Time: {dirInfo.CreationTime}");
        Console.WriteLine($"Last Access Time: {dirInfo.LastAccessTime}");
        Console.WriteLine($"Last Write Time: {dirInfo.LastWriteTime}");
        Console.WriteLine($"Attributes: {dirInfo.Attributes}");
    }
}

该示例显示了各种目录属性,包括名称、父目录、创建时间和属性。 FullName 返回目录的完整路径。 Name 仅返回路径的目录名称部分。

Parent 返回父目录,而 Root 返回路径的根部分。 与时间相关的属性显示目录的创建时间、上次访问时间和上次修改时间。 Attributes 返回目录的文件系统属性。

枚举文件和目录

DirectoryInfo 提供了枚举文件和子目录的方法。 此示例演示如何列出给定路径中的所有文件和目录。

Program.cs
using System;
using System.IO;

class Program
{
    static void Main()
    {
        DirectoryInfo dirInfo = new DirectoryInfo(@"C:\Temp");
        
        Console.WriteLine("Files:");
        foreach (FileInfo file in dirInfo.GetFiles())
        {
            Console.WriteLine($"- {file.Name} ({file.Length} bytes)");
        }
        
        Console.WriteLine("\nDirectories:");
        foreach (DirectoryInfo dir in dirInfo.GetDirectories())
        {
            Console.WriteLine($"- {dir.Name}");
        }
    }
}

GetFiles 返回目录中文件的 FileInfo 对象数组。 GetDirectories 返回子目录的 DirectoryInfo 对象数组。 该示例首先为目标目录创建一个 DirectoryInfo 实例。

然后,它使用 GetFiles 检索所有文件并显示其名称和大小。 GetDirectories 检索所有子目录,它们的名称也会显示。 这些方法具有接受搜索模式和枚举选项的重载,以便更好地控制结果。

移动目录

DirectoryInfo 允许将目录移动到新位置。 此示例演示如何使用 MoveTo 方法移动目录。

Program.cs
using System;
using System.IO;

class Program
{
    static void Main()
    {
        string sourcePath = @"C:\Temp\SourceDir";
        string destPath = @"C:\Temp\DestDir";
        
        DirectoryInfo sourceDir = new DirectoryInfo(sourcePath);
        
        if (!sourceDir.Exists)
        {
            sourceDir.Create();
            Console.WriteLine($"Created source directory: {sourcePath}");
        }
        
        if (Directory.Exists(destPath))
        {
            Directory.Delete(destPath, true);
            Console.WriteLine($"Deleted existing destination: {destPath}");
        }
        
        sourceDir.MoveTo(destPath);
        Console.WriteLine($"Moved directory from {sourcePath} to {destPath}");
    }
}

MoveTo 方法将目录移动到新位置。 目标必须不存在。 该示例首先确保源目录存在,必要时创建它。 然后,它检查目标目录是否存在,如果存在则删除它。

最后,它使用 MoveTo 将源目录移动到目标路径。 请注意,MoveTo 也可以用于通过在同一父目录中指定新名称来重命名目录。 当在同一卷中移动时,该操作在文件系统级别是原子的。

搜索文件和目录

DirectoryInfo 提供带有模式的搜索功能。 此示例演示如何使用搜索模式搜索特定文件和目录。

Program.cs
using System;
using System.IO;

class Program
{
    static void Main()
    {
        DirectoryInfo dirInfo = new DirectoryInfo(@"C:\Temp");
        
        Console.WriteLine("Text files:");
        foreach (FileInfo file in dirInfo.GetFiles("*.txt"))
        {
            Console.WriteLine($"- {file.Name}");
        }
        
        Console.WriteLine("\nDirectories starting with 'A':");
        foreach (DirectoryInfo dir in dirInfo.GetDirectories("A*"))
        {
            Console.WriteLine($"- {dir.Name}");
        }
        
        Console.WriteLine("\nAll PDF files (including subdirectories):");
        foreach (FileInfo file in dirInfo.GetFiles("*.pdf", SearchOption.AllDirectories))
        {
            Console.WriteLine($"- {file.FullName}");
        }
    }
}

GetFiles 和 GetDirectories 接受搜索模式,如 "*.txt" 或 "A*"。 SearchOption.AllDirectories 启用递归搜索。 该示例演示了三个不同的搜索。 首先,它使用 "*.txt" 模式查找目录中的所有 .txt 文件。

其次,它使用 "A*" 模式查找以 'A' 开头的目录。 最后,它使用 SearchOption.AllDirectories 递归搜索目录及其子目录中的所有 PDF 文件。 这些搜索功能使得在复杂的目录结构中查找特定文件或目录变得容易。

处理目录安全

DirectoryInfo 提供对目录安全信息的访问。 此示例演示如何获取和设置目录访问控制设置。

Program.cs
using System;
using System.IO;
using System.Security.AccessControl;

class Program
{
    static void Main()
    {
        string path = @"C:\Temp\SecureDir";
        DirectoryInfo dirInfo = new DirectoryInfo(path);
        
        if (!dirInfo.Exists)
        {
            dirInfo.Create();
        }
        
        // Get current security settings
        DirectorySecurity dirSecurity = dirInfo.GetAccessControl();
        Console.WriteLine("Current access rules:");
        
        foreach (FileSystemAccessRule rule in dirSecurity.GetAccessRules(
            true, true, typeof(System.Security.Principal.NTAccount)))
        {
            Console.WriteLine($"- {rule.IdentityReference}: {rule.FileSystemRights}");
        }
        
        // Add a new rule
        dirSecurity.AddAccessRule(new FileSystemAccessRule(
            @"BUILTIN\Users",
            FileSystemRights.ReadAndExecute,
            AccessControlType.Allow));
        
        dirInfo.SetAccessControl(dirSecurity);
        Console.WriteLine("\nAdded read/execute access for Users group.");
    }
}

GetAccessControl 检索目录的安全描述符。 SetAccessControl 应用新的安全设置。 该示例首先创建一个目录(如果它不存在)。 然后,它使用 GetAccessControl 检索当前的访问控制列表。

使用 GetAccessRules 显示当前规则。 添加一个新的访问规则,以向 Users 组授予读取和执行权限。 最后,使用 SetAccessControl 应用修改后的安全描述符。 这演示了如何在 C# 中以编程方式管理目录权限。

来源

DirectoryInfo 类文档

本教程介绍了使用 DirectoryInfo 在 C# 中处理目录,包括创建、删除、枚举、移动和安全管理。

作者

我的名字是 Jan Bodnar,我是一位充满激情的程序员,拥有丰富的编程经验。 我自 2007 年以来一直在撰写编程文章。 至今,我已撰写超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 C# 教程