站点图标 江湖人士

只需1行代码实现C#复制文件夹功能

做为一个C#开发人员,如遇到上传文件等功能时,时常会有C#复制文件夹的功能,通常都会用到System.IO命名空间的类库来进行文件操作,前不久在编写一个批量克隆git存储库的功能时,也遇到了类似的功能,来说说我是用了什么样的只有【1】行代码即实现了复制文件夹功能。

在开始正题之前,我们来回顾一下一些常见的写法,顺便提一下,利用本文提供的方法,你也可以实现C# 复制文件夹、C#重命名文件夹、C#重命名文件、C#移动文件、C#移动目录的功能,统统只要一行代码。

只需1行代码实现C#复制文件夹功能 4

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://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/file-system/how-to-copy-delete-and-move-files-and-folders

其它的代码这里就暂不举例了。直接上答案吧。

//这个就是移动文件的方法,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 )
退出移动版