• .NET I/O 学习笔记:目录和文件


      在.NET Framework中System.IO 命名空间包含允许对数据流和文件进行同步和异步读取及写入的类型。在.NET开发中的对文件进行I/O操作的类都位于该命名空间中。

    1.通过递归调用复制目录及其子目录所有文件

    View Code
     1         /// <summary>
     2         /// 复制目录文件(可包括其子目录)
     3         /// </summary>
     4         /// <param name="sourceDirName">源目录</param>
     5         /// <param name="destDirName">复制目录</param>
     6         /// <param name="copySubDirs">是否复制子目录</param>
     7         public static void DirectoryCopy(string sourceDirName, string destDirName, bool copySubDirs)
     8         {
     9             DirectoryInfo dir = new DirectoryInfo(sourceDirName);
    10             //获取源目录的子目录
    11             DirectoryInfo[] dirs = dir.GetDirectories();
    12 
    13             //源目录不存在,抛出异常 
    14             if (!dir.Exists)
    15             {
    16                 throw new DirectoryNotFoundException("源目录不存在或者无法找到:" + sourceDirName);
    17             }
    18 
    19             //复制目录不存在则创建一个
    20             if (!Directory.Exists(destDirName))
    21             {
    22                 Directory.CreateDirectory(destDirName);
    23             }
    24 
    25             //获取源目录文件列表
    26             FileInfo[] files = dir.GetFiles();
    27 
    28             foreach (FileInfo file in files)
    29             {
    30                 //根据复制目录名称和源目录的文件名合成路径字符串
    31                 string tempPate = Path.Combine(destDirName, file.Name);
    32                 //复制文件
    33                 if (!File.Exists(tempPate))
    34                 {
    35                     file.CopyTo(tempPate, false);//等于true时可以直接覆盖原文件
    36                 }
    37                 else
    38                 {
    39                     Console.WriteLine("在{0}目录,文件{1}已存在!", destDirName, file.Name);
    40                 }
    41             }
    42 
    43             //copySubDirs等于true,复制子目录
    44             if (copySubDirs)
    45             {
    46                 foreach (DirectoryInfo subDir in dirs)
    47                 {
    48                     //创建子目录
    49                     string tempPath = Path.Combine(destDirName, subDir.Name);
    50                     //复制子目录文件,这里使用递归的方式来调用,直到没有子目录可供复制
    51                     DirectoryCopy(subDir.FullName, tempPath, copySubDirs);
    52                 }
    53             }
    54         }

    2.获取目录特定匹配模式的文件列表

    View Code
     1         /// <summary>
     2         /// 获取目录文件匹配列表
     3         /// </summary>
     4         /// <param name="sourceDirName">源目录名称</param>
     5         /// <param name="searchPattern">匹配模式</param>
     6         /// <param name="copySubDirs">是否查找子目录</param>
     7         public static void GetDirectoryFileList(string sourceDirName, string searchPattern, bool searchSubDirs)
     8         {
     9             DirectoryInfo dir = new DirectoryInfo(sourceDirName);
    10             DirectoryInfo[] dirs = null;
    11             //获取源目录的子目录
    12             try
    13             {
    14                 dirs = dir.GetDirectories();
    15 
    16                 //源目录不存在,抛出异常 
    17                 if (!dir.Exists)
    18                 {
    19                     throw new DirectoryNotFoundException("源目录不存在或者无法找到:" + sourceDirName);
    20                 }
    21 
    22                 //获取源目录模式匹配的文件列表
    23                 FileInfo[] files = dir.GetFiles(searchPattern);
    24 
    25                 foreach (FileInfo file in files)
    26                 {
    27                     string name = file.Name;
    28                     long size = file.Length;
    29                     DateTime creatiOnTime = file.CreationTime;
    30                     Console.WriteLine("文件大小:{0,-12:N0} 创建时间:{1,-20:g} {2}", size, creatiOnTime, name);
    31                 }
    32 
    33                 if (searchSubDirs)
    34                 {
    35                     foreach (DirectoryInfo subDir in dirs)
    36                     {
    37                         //查询子目录文件,这里使用递归的方式来调用,直到没有子目录可供复制
    38                         GetDirectoryFileList(subDir.FullName, searchPattern, searchSubDirs);
    39                     }
    40                 }
    41             }
    42             catch (Exception ex)
    43             {
    44                 Console.WriteLine(ex.Message);
    45             }
    46         }

    3.使用枚举目录和文件

      从.NET Framework 4.0开始,增加一系列方法来枚举目录和文件,这些方法返回一个目录和文件的字符串的可枚举集合。也可以使用将返回DirectoryInfoFileInfoFileSystemInfo对象的可枚举集合的方法。在.NET Framework的早起版本中,只能获取这些集合的数组,而可枚举的集合提供了更好的性能。

      枚举目录和文件的方法和原来非枚举目录和文件的方法不同点在于:当使用枚举目录和文件方法时,您可以在返回整个集合之前开始枚举对象(如: DirectoryInfo )的集合;当您使用非枚举(如:GetDirectories)时,则必须等待整个 (如:DirectoryInfo) 数组都被返回后才能访问数组。 因此,在处理许多文件和目录时,使用枚举目录和文件的方法可能更高效。

      下面是返回可枚举集合的方法列表:

    下面是使用了枚举目录和文件的示例:

    3.1,枚举目录名称

      使用 Directory.EnumerateDirectories(+3重载) 返回指定路径中的目录名称的可枚举集合。

    View Code
     1         /// <summary>
     2         /// 获取指定路径顶级子目录列表(枚举目录名称)
     3         /// </summary>
     4         /// <param name="srouceDirectory">需要获取子目录的路径</param>
     5         public static void GetEnumDirectory(string dirPath)
     6         {
     7             try
     8             {
     9                 if (Directory.Exists(dirPath))
    10                 {
    11                     //LINQ 查询
    12                     var dirs = from dir in Directory.EnumerateDirectories(dirPath) select dir;
    13 
    14                     foreach (var dir in dirs)
    15                     {
    16                         //截取字符串获取子目录名称
    17                         Console.WriteLine("{0}", dir.Substring(dir.LastIndexOf("\\") + 1));
    18                     }
    19                     Console.WriteLine("{0} directories found.", dirs.Count<string>().ToString());
    20                     //创建一个可选的列表集合
    21                     List<string> workDirs = new List<string>(dirs);
    22                 }
    23             }
    24             catch (UnauthorizedAccessException UAEx)
    25             {
    26                 Console.WriteLine(UAEx.Message);
    27             }
    28             catch (PathTooLongException PathEx)
    29             {
    30                 Console.WriteLine(PathEx.Message);
    31             }
    32             catch (Exception ex)
    33             {
    34                 Console.WriteLine(ex.Message);
    35             }
    36         }

    3.2,枚举目录信息

      使用 DirectoryInfo.EnumerateDirectories(+3重载) 返回当前目录中的目录信息的可枚举集合。 

    View Code
     1   /// <summary>
     2         /// 获取枚举目录信息
     3         /// </summary>
     4         /// <param name="path"></param>
     5         public static void GetEnumDirectoryInfoList(string path)
     6         {
     7             DirectoryInfo dir = new DirectoryInfo(path);
     8             IEnumerable<DirectoryInfo> dirList = dir.EnumerateDirectories("P*", SearchOption.TopDirectoryOnly);
     9             try
    10             {
    11                 foreach (DirectoryInfo dirInfo in dirList)
    12                 {
    13                     //截取字符串获取子目录名称
    14                     string dirName = dirInfo.FullName.Substring(dirInfo.FullName.LastIndexOf("\\") + 1);
    15                     Console.WriteLine("目录名称:{0,-20}创建时间:{1}", dirName, dirInfo.CreationTimeUtc.ToString());
    16                 }
    17             }
    18             catch (UnauthorizedAccessException ex)
    19             {
    20                 Console.WriteLine(ex.Message);
    21             }
    22             catch (Exception ex)
    23             {
    24                 Console.WriteLine(ex.Message);
    25             }
    26         }

    3.3,枚举文件名称

      使用 Directory.EnumerateFiles(+3重载) 返回指定路径中的文件名的可枚举集合。

    View Code
     1         /// <summary>
     2         /// 获取枚举文件名称
     3         /// </summary>
     4         /// <param name="path"></param>
     5         public static void GetEnumFiles(string path)
     6         {
     7             IEnumerable<string> files = Directory.EnumerateFiles(path,"*.exe",SearchOption.AllDirectories);
     8 
     9             try
    10             {
    11                 foreach (var file in files)
    12                 {
    13                    // Console.WriteLine(file);
    14                     //截取文件名
    15                     Console.WriteLine(file.Substring(file.LastIndexOf("\\")+1));
    16                 }
    17             }
    18             catch (UnauthorizedAccessException ex)
    19             {
    20                 Console.WriteLine(ex.Message);
    21             }
    22             catch (Exception ex)
    23             {
    24                 Console.WriteLine(ex.Message);
    25             }
    26         }

    3.4,枚举文件信息

      使用 DirectoryInfo.EnumerateFiles()(+3重载) 返回当前目录中的文件信息的可枚举集合。

    View Code
     1         /// <summary>
     2         /// 获取枚举文件信息 
     3         /// </summary>
     4         /// <param name="path"></param>
     5         public static void GetEnumFileInfo(string path)
     6         {
     7             DirectoryInfo dir = new DirectoryInfo(path);
     8             try
     9             {
    10                 foreach (FileInfo file in dir.EnumerateFiles("*.exe", SearchOption.AllDirectories))
    11                 {
    12                     Console.WriteLine("文件名称:{0,-20}文件创建时间:{1}", file.Name, file.CreationTimeUtc.ToString());
    13                 }
    14             }
    15             catch (UnauthorizedAccessException ex)
    16             {
    17                 Console.WriteLine(ex.Message);
    18             }
    19             catch (Exception ex)
    20             {
    21                 Console.WriteLine(ex.Message);
    22             }
    23         }

    猛击下载:示例源码

    参考资料:

    http://msdn.microsoft.com/zh-cn/library/336wast5(v=vs.100)

    http://msdn.microsoft.com/zh-cn/library/dd997370(v=vs.100)#remove_open_handles

    作者:晴天猪

    出处:http://www.cnblogs.com/IPrograming 

    本文版权归作者和博客园共有,转载请注明出处。

  • 相关阅读:
    读《大道至简》第6章有感
    Java作业05(动手动脑)
    读《大道至简》第五章有感
    java作业04(动手动脑)
    域名与主机名
    STL 迭代器学习
    数组与链表增删改查效率比较
    智能指针多线程安全问题
    快速乘 学习
    关于TCP三个冗余ACK启动快速重传
  • 原文地址:https://www.cnblogs.com/IPrograming/p/Base_IO.html
Copyright © 2020-2023  润新知