一个拷贝整个文件夹(包括子文件夹)的方法

需要引用命名空间:
using System.IO;

/// <summary>
  /// 拷贝文件夹(包括子文件夹)到指定文件夹下,源文件夹和目标文件夹均需绝对路径. 格式: CopyFolder(源文件夹,目标文件夹);
  /// </summary>
  /// <param name="strFromPath"></param>
  /// <param name="strToPath"></param>

  //--------------------------------------------------
  //作者:kgdiwss QQ:305725744
 //---------------------------------------------------

  public static void CopyFolder(string strFromPath,string strToPath)
  {
   //如果源文件夹不存在,则创建
   if (!Directory.Exists(strFromPath))
   {    
    Directory.CreateDirectory(strFromPath);
   }   

   //取得要拷贝的文件夹名
   string strFolderName = strFromPath.Substring(strFromPath.LastIndexOf("//") + 1,strFromPath.Length - strFromPath.LastIndexOf("//") - 1);   

   //如果目标文件夹中没有源文件夹则在目标文件夹中创建源文件夹
   if (!Directory.Exists(strToPath + "//" + strFolderName))
   {    
    Directory.CreateDirectory(strToPath + "//" + strFolderName);
   }
   //创建数组保存源文件夹下的文件名
   string[] strFiles = Directory.GetFiles(strFromPath);

   //循环拷贝文件
   for(int i = 0;i < strFiles.Length;i++)
   {
    //取得拷贝的文件名,只取文件名,地址截掉。
    string strFileName = strFiles[i].Substring(strFiles[i].LastIndexOf("//") + 1,strFiles[i].Length - strFiles[i].LastIndexOf("//") - 1);
    //开始拷贝文件,true表示覆盖同名文件
    File.Copy(strFiles[i],strToPath + "//" + strFolderName + "//" + strFileName,true);
   }
  
   //创建DirectoryInfo实例
   DirectoryInfo dirInfo = new DirectoryInfo(strFromPath);
   //取得源文件夹下的所有子文件夹名称
   DirectoryInfo[] ZiPath = dirInfo.GetDirectories();
   for (int j = 0;j < ZiPath.Length;j++)
   {
    //获取所有子文件夹名
    string strZiPath = strFromPath + "//" + ZiPath[j].ToString();   
    //把得到的子文件夹当成新的源文件夹,从头开始新一轮的拷贝
    CopyFolder(strZiPath,strToPath + "//" + strFolderName);
   }
  }


需要引用命名空间:
using System.IO;

/// <summary>
  /// 拷贝文件夹(包括子文件夹)到指定文件夹下,源文件夹和目标文件夹均需绝对路径. 格式: CopyFolder(源文件夹,目标文件夹);
  /// </summary>
  /// <param name="strFromPath"></param>
  /// <param name="strToPath"></param>

  //--------------------------------------------------
  //作者:kgdiwss QQ:305725744
 //---------------------------------------------------

  public static void CopyFolder(string strFromPath,string strToPath)
  {
   //如果源文件夹不存在,则创建
   if (!Directory.Exists(strFromPath))
   {    
    Directory.CreateDirectory(strFromPath);
   }   

   //取得要拷贝的文件夹名
   string strFolderName = strFromPath.Substring(strFromPath.LastIndexOf("//") + 1,strFromPath.Length - strFromPath.LastIndexOf("//") - 1);   

   //如果目标文件夹中没有源文件夹则在目标文件夹中创建源文件夹
   if (!Directory.Exists(strToPath + "//" + strFolderName))
   {    
    Directory.CreateDirectory(strToPath + "//" + strFolderName);
   }
   //创建数组保存源文件夹下的文件名
   string[] strFiles = Directory.GetFiles(strFromPath);

   //循环拷贝文件
   for(int i = 0;i < strFiles.Length;i++)
   {
    //取得拷贝的文件名,只取文件名,地址截掉。
    string strFileName = strFiles[i].Substring(strFiles[i].LastIndexOf("//") + 1,strFiles[i].Length - strFiles[i].LastIndexOf("//") - 1);
    //开始拷贝文件,true表示覆盖同名文件
    File.Copy(strFiles[i],strToPath + "//" + strFolderName + "//" + strFileName,true);
   }
  
   //创建DirectoryInfo实例
   DirectoryInfo dirInfo = new DirectoryInfo(strFromPath);
   //取得源文件夹下的所有子文件夹名称
   DirectoryInfo[] ZiPath = dirInfo.GetDirectories();
   for (int j = 0;j < ZiPath.Length;j++)
   {
    //获取所有子文件夹名
    string strZiPath = strFromPath + "//" + ZiPath[j].ToString();   
    //把得到的子文件夹当成新的源文件夹,从头开始新一轮的拷贝
    CopyFolder(strZiPath,strToPath + "//" + strFolderName);
   }
  }


拷贝整个文件夹有多种实现方式,以下为你介绍不同编程语言及工具的实现方法: ### BAT 批处理 BAT 批处理适合个人用户和企业或组织进行大规模的文件管理,能以简单、高效的方式解决文件夹复制中的各种问题,是文件管理自动化的重要工具之一[^1]。以下是一个简单示例: ```batch @echo off xcopy "源文件夹路径" "目标文件夹路径" /e /i ``` 其中,`/e` 表示复制所有目录,包括空目录;`/i` 表示如果目标不存在,且要复制多个文件,则假定目标一定是一个目录。 ### Python 使用 `shutil.copytree` 函数可以拷贝整个文件夹,需要注意拷贝文件夹的权限会与原始文件夹保持一致;如果拷贝文件夹已经存在则会报错;拷贝文件夹中的文件夹和文件会保留原始的创建和修改时间;如果文件夹中包含软链接,新的文件夹中会保持这些链接而非实际文件[^2]。示例代码如下: ```python import shutil try: shutil.copytree('源文件夹路径', '目标文件夹路径') except FileExistsError: print("目标文件夹已存在,请先删除或更改目标路径。") ``` ### C# 可以使用 `Microsoft.VisualBasic.FileIO` 命名空间下的 `FileSystem.CopyDirectory` 方法,`UIOption.AllDialogs` 参数会显示拷贝的操作进度[^4]。示例代码如下: ```csharp using Microsoft.VisualBasic.FileIO; class Program { static void Main() { string sourcePath = "源文件夹路径"; string destinationPath = "目标文件夹路径"; FileSystem.CopyDirectory(sourcePath, destinationPath, UIOption.AllDialogs); } } ``` 也可以通过递归的方式实现文件夹拷贝,示例代码如下: ```csharp using System; using System.IO; class Program { static void CopyDirectory(string srcPath, string desPath) { string folderName = srcPath.Substring(srcPath.LastIndexOf("\\") + 1); string desfolderdir = desPath + "\\" + folderName; if (desPath.LastIndexOf("\\") == (desPath.Length - 1)) { desfolderdir = desPath + folderName; } string[] filenames = Directory.GetFileSystemEntries(srcPath); foreach (string file in filenames) { if (Directory.Exists(file)) { string currentdir = desfolderdir + "\\" + file.Substring(file.LastIndexOf("\\") + 1); if (!Directory.Exists(currentdir)) { Directory.CreateDirectory(currentdir); } CopyDirectory(file, desfolderdir); } else { string srcfileName = file.Substring(file.LastIndexOf("\\") + 1); srcfileName = desfolderdir + "\\" + srcfileName; if (!Directory.Exists(desfolderdir)) { Directory.CreateDirectory(desfolderdir); } File.Copy(file, srcfileName); } } } static void Main() { string sourcePath = "源文件夹路径"; string destinationPath = "目标文件夹路径"; CopyDirectory(sourcePath, destinationPath); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值