在.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 IEnumerabledirList = 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 IEnumerablefiles = 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 }
猛击下载:
参考资料:
作者:
出处:
本文版权归作者和博客园共有,转载请注明出处。