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

  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

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 对象。

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 类:适用于需要多次操作同一目录或需要访问目录详细信息的情况,代码更具结构性和可维护性。

12-20 17:20