做为一个C#开发人员,如遇到上传文件等功能时,时常会有C#复制文件夹的功能,通常都会用到System.IO命名空间的类库来进行文件操作,前不久在编写一个批量克隆git存储库的功能时,也遇到了类似的功能,来说说我是用了什么样的只有【1】行代码即实现了复制文件夹功能。
在开始正题之前,我们来回顾一下一些常见的写法,顺便提一下,利用本文提供的方法,你也可以实现C# 复制文件夹、C#重命名文件夹、C#重命名文件、C#移动文件、C#移动目录的功能,统统只要一行代码。
C#复制文件夹所有内容(常规写法)
下面是我们常见的通过循环复制文件夹里面的内容到新目录的代码,或许很多人都会这样写。
/// <summary> /// 复制一个目录(文件夹,https://jhrs.com 首发)到新目录,如果目标目录不存在则新建 /// </summary> /// <param name="sourceDir">源目录</param> /// <param name="destDir">目标目录</param> private static void CopyFolder(string sourceDir, string destDir) { if (!Directory.Exists(destDir)) { Directory.CreateDirectory(destDir); } try { string[] fileList = Directory.GetFiles(sourceDir, "*"); foreach (string f in fileList) { string fName = f.Substring(sourceDir.Length + 1); File.Copy(Path.Combine(sourceDir, fName), Path.Combine(destDir, fName), true); } } catch (DirectoryNotFoundException dirNotFound) { throw new DirectoryNotFoundException(dirNotFound.Message); } }
那我们来看看只有1行C#代码就可实现复制文件夹的功能。在开始之前,请先添加引用:Microsoft.VisualBasic.FileIO,添加后,只需要这样写就可以了。需要说明的是,别以为看到是VB命名空间的,就不能调用,实际上放心的调用即可。
using Microsoft.VisualBasic.FileIO; //真实项目中,我也是调用的这个方法,只需要一行代码就可以实现复制目录功能。 //效率是非常高的,尤其是复制GB级别大小的文件(jhrs.com)。 FileSystem.CopyDirectory(sourceDir, destDir);
怎么样,是不是很简单呢?
C#重命名文件夹
通过C#代码对文件夹进行重命名也是常见功能或需求,而在网上搜索到的常见代码都是通过先创建新目录,然后移动原来的文件到新目录的方式,大概所能见到的代码如下所示:
//步骤1,先创建新目录,当前步骤非必须 Directory.CreateDirectory(destinationDir); //步骤2,找到文件,并移动 FileInfo file = new FileInfo(srcFileName); file.MoveTo(destFileName);
以前只是常见的示例代码,事实上都是需要进行文件移动操作,那么有没有像我们使用鼠标右键,选中文件夹直接重命名的方法呢?答案是有的,还是利用FileSystem类提供的方法,如下:
//这个就是重命名目录的方法,https://jhrs.com(江湖人士,国外网赚)让你回答,是不是很简单呢? FileSystem.RenameDirectory(sourceDir, destDir);
C#重命名文件
重命名文件的需求经常出现在上传功能时,用户上传的文件服务器端需要对它进行重命名,通常会写出网上常见的类似代码:
File.Move(),File.Copy() 版本的:
string src = @"原文件路径:C:\jhrs\com\old.file"; string dest = @"新文件路径:C:\jhrs\com\new.file"; try { File.Move(src, dest); if (!File.Exists(src)) { Console.WriteLine("jhrs.com提示:文件重命名成功."); } } catch (IOException e) { Console.WriteLine("jhrs.com提示:{0}", e.ToString()); } //或者通过复制文件方式 File.Copy(src, dest, true); File.Delete(src);
有了上面的知识,我们可以类推得出,同样的我们可以使用FileSystem提供的方法对文件进行重命名了。
//这个就是重命名文件的方法,https://jhrs.com(江湖人士,国外网赚)让你回答,是不是很简单呢? FileSystem.RenameFile(oldFile, newFile);
C#移动文件
文件操作常见功能就是移动文件,微软官网文档也给了示例文档,这是官网链接:
其它的代码这里就暂不举例了。直接上答案吧。
//这个就是移动文件的方法,https://jhrs.com(江湖人士,国外网赚)让你回答,是不是很简单呢? FileSystem.MoveFile(sourceFileName,destinationFileName)
C#移动目录
当你通过代码移动目录时,如果被移动的目录文件非常的大,再通过递归遍历/循环遍历目录里面的文件进行移动是非常低效的做法。FileSystem提供了现成的方法,你可以调用它来移动目录,经测试效率非常高。
//这个就是移动目录的方法,https://jhrs.com(江湖人士,国外网赚)让你回答,是不是很简单呢? FileSystem.MoveDirectory(sourceDirectoryName, destinationDirectoryName)
最后说一下,你也可以调用FileSystem.DeleteDirectory方法删除目录,其它的方法,自己在VS里面看一下提示吧,基本上从命名我们就知道它实现的是什么功能。需要注意的是,被删除的文件或者目录如果有只读属性需要给它去掉。
/// <summary> /// 递归去除文件,jhrs.com 首发,目录的只读属性 /// </summary> /// <param name="dir"></param> private void RemoveDirReadOnley(DirectoryInfo dir) { dir.Attributes &= ~FileAttributes.ReadOnly; var files = dir.GetFiles(); Parallel.ForEach(files, (f) => { f.Attributes &= ~FileAttributes.ReadOnly; }); var dires = dir.GetDirectories(); Parallel.ForEach(dires, (f) => { f.Attributes &= ~FileAttributes.ReadOnly; files = f.GetFiles(); Parallel.ForEach(files, (m) => { m.Attributes &= ~FileAttributes.ReadOnly; }); RemoveDirReadOnley(f); }); }
结论
C# 中的细节还是有点多,使用C#进行文件操作是很常见的功能,当有大量的文件,目录需要移动,重命名,复制时,需要考虑一下效率的问题;FileSystem这个类提供的静态方法基本上涵盖了文件的增、删、改、移的操作,我们再也不需要去写一些繁杂的代码来进行文件操作了,直接用最简单的方法吧。
都2022年了,2022年的全球开源生态研究报告中提到了.net 的全规性不错,这是报告,你可以在22页找到相关描述。
2024全球开源生态研究报告下载 (下载783 )