博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.NET I/O 学习笔记:目录和文件
阅读量:6705 次
发布时间:2019-06-25

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

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

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

View Code
1         ///  2         /// 复制目录文件(可包括其子目录) 3         ///  4         /// 源目录 5         /// 复制目录 6         /// 是否复制子目录 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                 else38                 {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         ///  2         /// 获取目录文件匹配列表 3         ///  4         /// 源目录名称 5         /// 匹配模式 6         /// 是否查找子目录 7         public static void GetDirectoryFileList(string sourceDirName, string searchPattern, bool searchSubDirs) 8         { 9             DirectoryInfo dir = new DirectoryInfo(sourceDirName);10             DirectoryInfo[] dirs = null;11             //获取源目录的子目录12             try13             {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开始,增加一系列方法来枚举目录和文件,这些方法返回一个目录和文件的字符串的可枚举集合。也可以使用将返回、或对象的可枚举集合的方法。在.NET Framework的早起版本中,只能获取这些集合的数组,而可枚举的集合提供了更好的性能。

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

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

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

3.1,枚举目录名称

  使用  返回指定路径中的目录名称的可枚举集合。

View Code
1         ///  2         /// 获取指定路径顶级子目录列表(枚举目录名称) 3         ///  4         /// 需要获取子目录的路径 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
().ToString());20 //创建一个可选的列表集合21 List
workDirs = new List
(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,枚举目录信息

  使用  返回当前目录中的目录信息的可枚举集合。 

View Code
1   ///  2         /// 获取枚举目录信息 3         ///  4         ///  5         public static void GetEnumDirectoryInfoList(string path) 6         { 7             DirectoryInfo dir = new DirectoryInfo(path); 8             IEnumerable
dirList = dir.EnumerateDirectories("P*", SearchOption.TopDirectoryOnly); 9 try10 {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,枚举文件名称

  使用  返回指定路径中的文件名的可枚举集合。

View Code
1         ///  2         /// 获取枚举文件名称 3         ///  4         ///  5         public static void GetEnumFiles(string path) 6         { 7             IEnumerable
files = Directory.EnumerateFiles(path,"*.exe",SearchOption.AllDirectories); 8 9 try10 {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,枚举文件信息

  使用  返回当前目录中的文件信息的可枚举集合。

View Code
1         ///  2         /// 获取枚举文件信息  3         ///  4         ///  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         }

 

猛击下载:

参考资料:

作者:

出处: 

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

你可能感兴趣的文章
人工智能也可用于对抗全球变暖 让数据中心能耗仅为3%
查看>>
5月以来逾200家公司重要股东增持 *ST海润已获10次增持
查看>>
java 排序算法
查看>>
Java简单工厂模式
查看>>
摩拜单车使用
查看>>
C/S和B/S软件测试区别
查看>>
比特币矿机开发公司 Butterfly Labs 接受和解
查看>>
GNU C Library 高危漏洞影响大量应用和设备
查看>>
《深入理解Elasticsearch(原书第2版)》一2.4.1 过滤及查询相关性
查看>>
Mozilla 封杀纂改安全设置的流行 Firefox 扩展
查看>>
如果想自己动手写Docker,你可能需要看这本书(文末附录五篇精彩书摘)
查看>>
《Hadoop与大数据挖掘》一2.6.2 Hadoop TF-IDF编程思路
查看>>
《编写高质量代码:改善c程序代码的125个建议》——建议3-3:使用分数来精确表达浮点数...
查看>>
《IP多播网络的设计与部署(第1卷)》——第1章 IP多播介绍
查看>>
《SQL入门经典(第5版)》一一6.5 问与答
查看>>
《Origin 9.0科技绘图与数据分析超级学习手册》一2.4 工具栏
查看>>
《树莓派Python编程入门与实战》——1.5 决定如何购买外设
查看>>
《Android游戏开发详解》——第2章,第2.16节区分类和对象
查看>>
《网页设计心理学》一1.4 大脑中发生了很多我们不了解的事情
查看>>
HTML5中<script>标签中的defer与async属性详解
查看>>