C# 拷贝整个目录

本文介绍如何使用C#编程语言实现将一个目录及其所有子目录和文件完整拷贝到另一位置的方法,涵盖文件遍历及文件流操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

xxxxx

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace ImgTrans
{
    /// <summary>
    /// 目录拷贝
    /// </summary>
    class KDirCopy
    {
        /// <summary>
        /// 检测源目录是否存在,如果存在则创建对应目标目录
        /// </summary>
        /// <param name="fml_sDst">目标目录</param>
        /// <param name="fml_sSrc">源目录</param>
        /// <returns></returns>
        public static bool CheckDirs(string fml_sDst, string fml_sSrc)
        {
            bool ok1, ok2, ok3;
            ok1 = Directory.Exists(fml_sDst);
            ok2 = Directory.Exists(fml_sSrc);

            if (!ok2)
            {
                mg.Msg("请检查源目录格式信息", "源目录不存在");
                return false;
            }

            // 目标目录不存在则进行创建
            if (!ok1)
            {
                try
                {
                    Directory.CreateDirectory(fml_sDst);
                    ok3 = true;
                    return true;
                }
                catch (Exception ex)
                {
                    ok3 = false;
                    mg.Msg(ex.Message, "创建目标目录失败");
                    return false;
                }
            }
            else
            {
                return true;
            }

        }

        /// <summary>
        /// 文件夹拷贝
        /// 从指定的源目录拷贝所有文件到目标目录
        /// 如果目标文件存在则跳过拷贝
        /// </summary>
        /// <param name="fml_sDst">目标目录</param>
        /// <param name="fml_sSrc">源目录</param>
        /// <returns></returns>
        public static bool Copy(string fml_sDst, string fml_sSrc)
        {
            if (!CheckDirs(fml_sDst, fml_sSrc))
            {
                return false;
            }

            /* 迭代拷贝文件
             * 1.将源目录存入列表
             * 2.检测当前列表第一项目录是否存在,不存在则创建
             * 3.检测当前列表第一项目录下的所有文件,并拷贝到目标文件夹下
             * 4.检测当前列表第一项目录下的文件夹,添加到列表
             * 5.移除第一项
             * 6.循环第2到第4步,直到列表项为0 */
            List<string> dirs = new List<string>();
            dirs.Add(fml_sSrc);
            while(dirs.Count != 0)
            {
                string dst_dir = dirs[0].Replace(fml_sSrc, fml_sDst);
                // 如果目标目录不存在则创建
                if (!Directory.Exists(dst_dir))
                {
                    Directory.CreateDirectory(dst_dir);
                }
                List<string> fnames = new List<string>(Directory.EnumerateFiles(dirs[0]));
                foreach(string fname in fnames)
                {
                    FileInfo fi = new FileInfo(fname); //获取文件信息
                    string dst_name = dst_dir + @"\" + fi.Name;
                    try
                    {
                        // 检测本地是否已经存在该文件,如果存在则跳过
                        if(!File.Exists(dst_name))
                        {
                            File.Copy(fname, dst_name);
                        }
                        else
                        {
                            Console.WriteLine("文件 {0} 已存在,跳过拷贝。", dst_name);
                        }
                    }
                    catch (Exception ex)
                    {
                        mg.Msg(ex.Message, "拷贝文件错误");
                    }
                }
                // 列举当前目录下的子目录列表
                List<string> sub_dirs = new List<string>(Directory.EnumerateDirectories(dirs[0]));
                dirs.AddRange(sub_dirs);
                dirs.RemoveAt(0);
            }
            return true;
        }

        /// <summary>
        /// 预留 在独立线程内进行拷贝
        /// </summary>
        /// <param name="fml_sDst"></param>
        /// <param name="fml_sSrc"></param>
        /// <returns></returns>
        public static bool threadCopy(string fml_sDst, string fml_sSrc)
        {
            return false;
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值