.NET I/O 学习笔记:目录和文件
发布日期:2021-05-28 16:26:42 浏览次数:35 分类:精选文章

本文共 4700 字,大约阅读时间需要 15 分钟。

在.NET Framework中操作文件和目录

一、复制目录及其子目录的文件

在C#中,你可以编写一个递归的方法来复制指定目录及其子目录中的所有文件到目标目录。以下是一个实现示例:

/// 
/// 复制目录文件(可包括其子目录)
///
/// 源目录
/// 复制目录
/// 是否复制子目录
public static void DirectoryCopy(string sourceDirName, string destDirName, bool copySubDirs)
{
// 创建 DirectoryInfo 对象
DirectoryInfo dir = new DirectoryInfo(sourceDirName);
// 检查源目录是否存在
if (!dir.Exists)
{
throw new DirectoryNotFoundException("源目录不存在或者无法找到: " + sourceDirName);
}
// 创建目标目录,如果不存在则创建
if (!Directory.Exists(destDirName))
{
Directory.CreateDirectory(destDirName);
}
// 获取源目录中的文件
FileInfo[] files = dir.GetFiles();
foreach (FileInfo file in files)
{
string tempPath = Path.Combine(destDirName, file.Name);
if (!File.Exists(tempPath))
{
file.CopyTo(tempPath, false); // 如果使用true,可以覆盖原文件
}
else
{
Console.WriteLine("文件{0}已存在于目标目录{1}", file.Name, destDirName);
}
}
// 复制子目录(如果需要)
if (copySubDirs)
{
// 获取源目录的子目录
DirectoryInfo[] dirs = dir.GetDirectories();
foreach (DirectoryInfo subDir in dirs)
{
string subDirName = subDir.Name;
string subDirPath = subDir.FullName;
string tempPath = Path.Combine(destDirName, subDirName);
// 递归复制子目录中的文件
DirectoryCopy(subDirPath, tempPath, copySubDirs);
}
}
}

二、获取特定模式文件列表

以下方法可以帮助你获取特定文件模式下的文件列表,包括子目录中的文件:

/// 
/// 获取目录文件匹配列表
///
/// 源目录名称
/// 匹配模式
/// 是否查找子目录
public static void GetDirectoryFileList(string sourceDirName, string searchPattern, bool searchSubDirs)
{
DirectoryInfo dir = new DirectoryInfo(sourceDirName);
// 获取源目录子目录
DirectoryInfo[] dirs = dir.GetDirectories();
// 获取文件数组
FileInfo[] files = dir.GetFiles(searchPattern);
foreach (FileInfo file in files)
{
Console.WriteLine("文件大小: {0,-12:N0} 创建时间: {1:g} {2}",
file.Length, file.CreationTimeUtc, file.Name);
}
// 如果需要搜索子目录
if (searchSubDirs)
{
foreach (DirectoryInfo subDir in dirs)
{
GetDirectoryFileList(subDir.FullName, searchPattern, searchSubDirs);
}
}
}

三、利用枚举方法操作目录和文件

从.NET Framework 4.0开始,枚举方法(例如Directory.EnumerateDirectories和Directory.EnumerateFiles)被引入,提供了更直观和高效的接口。以下是一些示例:

  • 获取目录名称列表:
  • public static void GetEnumDirectory(string dirPath)
    {
    if (!Directory.Exists(dirPath))
    {
    throw new DirectoryNotFoundException("路径不存在: " + dirPath);
    }
    var dirs = Directory.EnumerateDirectories(dirPath)
    .Select(d => d.Name)
    .ToList();
    Console.WriteLine("总共有{0}个子目录", dirs.Count);
    foreach (var dir in dirs)
    {
    Console.WriteLine(dir);
    }
    }
    1. 获取目录信息:
    2. public static void GetEnumDirectoryInfoList(string path)
      {
      try
      {
      using (DirectoryInfo dir = new DirectoryInfo(path))
      {
      var dirList = dir.EnumerateDirectories("P*", SearchOption.TopDirectoryOnly);
      foreach (DirectoryInfo dirInfo in dirList)
      {
      string dirName = dirInfo.FullName.Substring(dirInfo.FullName.LastIndexOf("\\") + 1);
      Console.WriteLine("目录名称: {0} 创建时间: {1}", dirName, dirInfo.CreationTimeUtc);
      }
      }
      }
      catch (UnauthorizedAccessException ex)
      {
      Console.WriteLine(ex.Message);
      }
      }
      1. 获取文件名称列表:
      2. public static void GetEnumFiles(string path)
        {
        try
        {
        var files = Directory.EnumerateFiles(path, "*.exe", SearchOption.AllDirectories);
        foreach (var file in files)
        {
        // 你可以根据需要处理每个文件
        Console.WriteLine(file);
        // 或自定义输出格式
        string fileName = file.Substring(file.LastIndexOf("\\") + 1);
        Console.WriteLine("文件名: {0}", fileName);
        }
        }
        catch (UnauthorizedAccessException ex)
        {
        Console.WriteLine(ex.Message);
        }
        }
        1. 获取文件信息:
        2. public static void GetEnumFileInfo(string path)
          {
          try
          {
          using (DirectoryInfo dir = new DirectoryInfo(path))
          {
          var files = dir.EnumerateFiles("*.exe", SearchOption.AllDirectories);
          foreach (FileInfo file in files)
          {
          Console.WriteLine("文件名称: {0} 文件大小: {1}MB 创建时间: {2}",
          file.Name, (file.Length / 1024.0).ToString("N2"),
          file.CreationTimeUtc);
          }
          }
          }
          catch (UnauthorizedAccessException ex)
          {
          Console.WriteLine(ex.Message);
          }
          }

          这些方法提供了一个更直观和高效的方式来处理文件和目录操作,确保了代码简洁性和可读性。

    上一篇:第一章:绪论
    下一篇:AcWing 859 Kruskal算法求最小生成树

    发表评论

    最新留言

    第一次来,支持一个
    [***.219.124.196]2025年04月14日 22时57分43秒