C# 文件系统I/O操作--Directory类与DirectoryInfo类

两个同属一个命名空间: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 常用属性

  1. Attributes:获取或设置目录的属性。

    • 类型:FileAttributes

  2. CreationTime:获取或设置目录的创建日期和时间。

    • 类型:DateTime

  3. CreationTimeUtc:获取或设置目录的创建日期和时间(UTC 时间)。

    • 类型:DateTime

  4. Exists:获取一个值,该值指示目录是否存在。

    • 类型:bool

  5. Extension:获取表示目录扩展名部分的字符串。对于目录,此属性始终为空字符串。

    • 类型:string

  6. FullName:获取目录的完整路径。

    • 类型:string

  7. LastAccessTime:获取或设置目录最后一次被访问的日期和时间。

    • 类型:DateTime

  8. LastAccessTimeUtc:获取或设置目录最后一次被访问的日期和时间(UTC 时间)。

    • 类型:DateTime

  9. LastWriteTime:获取或设置目录最后一次写入的时间。

    • 类型:DateTime

  10. LastWriteTimeUtc:获取或设置目录最后一次写入的时间(UTC 时间)。

    • 类型:DateTime

  11. Name:获取目录的名称。

    • 类型:string

  12. Parent:获取父目录的 DirectoryInfo 对象。

    • 类型:DirectoryInfo

  13. 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 常用方法

  1. Create():创建目录。

    • 返回值:当前的 DirectoryInfo 实例。

  2. Delete(bool recursive):删除目录及其内容。

    参数:

    • recursive: 如果为 true,则递归删除目录及其所有子目录和文件;如果为 false,则仅删除空目录。

  3. GetDirectories(string searchPattern, SearchOption searchOption):检索匹配指定搜索模式的子目录。

    参数:

    • searchPattern: 要匹配的搜索字符串。

    • searchOption: 指定是否应包括所有子目录。

    • 返回值:DirectoryInfo 数组。

    • 说明:可以根据需要指定不同的搜索模式和搜索选项。

  4. GetFiles(string searchPattern, SearchOption searchOption):检索匹配指定搜索模式的文件。

    • 参数:

    • searchPattern: 要匹配的搜索字符串。

    • searchOption: 指定是否应包括所有子目录。

    • 返回值:FileInfo 数组。

    • 说明:可以根据需要指定不同的搜索模式和搜索选项。

  5. MoveTo(string destDirName):将目录及其内容移动到新位置。

    • 参数:

    • destDirName: 目标目录的完整路径。

    • 返回值:无。

    • 说明:如果目标目录已经存在,则会抛出异常。

  6. Refresh():刷新当前实例的状态,使其反映最新更改。

    • 返回值:无。

    • 说明:在对目录进行某些操作后,调用此方法可以确保对象的状态是最新的。

  7. ToString():返回表示当前对象的字符串。

    • 返回值:目录的完整路径。

    • 说明:通常用于调试或日志记录。

  8. CreateSubdirectory(string path):在当前目录中创建子目录。

    • 参数:

    • path: 子目录的相对路径。

    • 返回值:新创建的 DirectoryInfo 对象。

    • 说明:如果子目录已经存在,则不会抛出异常。

  9. GetFileSystemInfos(string searchPattern, SearchOption searchOption):检索匹配指定搜索模式的所有文件和子目录。

    • 参数:

    • searchPattern: 要匹配的搜索字符串。

    • searchOption: 指定是否应包括所有子目录。

    • 返回值:FileSystemInfo 数组。

    • 说明:返回的数组包含 FileInfo 和 DirectoryInfo 对象。

  10. 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 类优点和缺点

优点

  1. 简单易用:
    • 提供静态方法,可以直接调用,无需实例化对象。
    • 对于简单的目录操作非常方便快捷。
  2. 性能较好:
    • 因为是静态方法,避免了对象创建的开销,对于大量目录操作可能更高效。
  3. 适用于一次性操作:
    • 当只需要进行一次性的目录操作(如创建、删除)时,使用 Directory 类更为简洁。

缺点

  1. 缺乏状态管理:
    • 没有状态管理机制,每次操作都需要指定完整的目录路径。
    • 不适合需要多次操作同一目录的情况。
  2. 代码可读性较差:
    • 对于复杂的目录操作逻辑,使用静态方法可能导致代码难以阅读和维护。
  3. 灵活性有限:
    • 功能相对固定,无法像 DirectoryInfo 类那样灵活地扩展和自定义行为。

DirectoryInfo 类优点和缺点

优点

  1. 面向对象设计:
    • 代表具体的目录对象,提供了丰富的属性和方法,便于管理和操作目录。
    • 可以存储目录的状态信息,适合多次操作同一个目录的情况。
  2. 易于维护:
    • 使用对象的方式组织代码,结构清晰,便于维护和扩展。
    • 可以轻松地管理多个目录对象,而不需要重复调用静态方法。
  3. 支持更多的功能:
    • 提供了许多高级功能,如目录的创建时间、修改时间、子目录和文件列表等属性。
    • 支持递归遍历目录树,灵活性更高。

缺点

  1. 对象创建开销:
    • 需要创建 DirectoryInfo 对象,可能会带来一定的内存和性能开销。
    • 在需要频繁创建和销毁目录对象的情况下,可能不如 Directory 类高效。
  2. 复杂度增加:
    • 面向对象的设计增加了代码的复杂性,对于简单的目录操作显得有些繁琐。
    • 新手可能需要更多的时间来理解和使用 DirectoryInfo 类。
  3. 不适合一次性操作:
    • 对于只需要进行一次性的目录操作(如创建、删除),使用 DirectoryInfo 类会显得冗余。

四. 总结

• Directory 类:适用于简单的、一次性目录操作,代码简洁,性能较好。

• DirectoryInfo 类:适用于需要多次操作同一目录或需要访问目录详细信息的情况,代码更具结构性和可维护性。

相关推荐
小歆8846 分钟前
100%全国产化时钟服务器、全国产化校时服务器、全国产化授时服务器
运维·服务器
hgdlip14 分钟前
IP属地与视频定位位置不一致:现象解析与影响探讨
服务器·网络·tcp/ip
fmdpenny21 分钟前
Vue3初学之商品的增,删,改功能
开发语言·javascript·vue.js
涛ing35 分钟前
21. C语言 `typedef`:类型重命名
linux·c语言·开发语言·c++·vscode·算法·visual studio
0xfather38 分钟前
在Debian系统中安装Debian(Linux版PE装机)
linux·服务器·debian
等一场春雨1 小时前
Java设计模式 十四 行为型模式 (Behavioral Patterns)
java·开发语言·设计模式
Again_acme1 小时前
20250118面试鸭特训营第26天
服务器·面试·php
黄金小码农1 小时前
C语言二级 2025/1/20 周一
c语言·开发语言·算法
萧若岚1 小时前
Elixir语言的Web开发
开发语言·后端·golang
wave_sky1 小时前
解决使用code命令时的bash: code: command not found问题
开发语言·bash