C# 两个不同文件路径的同步

为了确保路径 A 下的文件和文件夹的结构与路径 B 下保持一致,可以编写一个 C# 程序来递归比较路径 A 和路径 B 中的文件夹和文件,并根据变化来更新路径 B 中的内容。具体来说,代码逻辑需要做到以下几点:

  1. 同步新创建的文件和文件夹:如果 A 中有 B 中没有的文件或文件夹,需要将它们复制到 B 中。
  2. 同步重命名的文件和文件夹:如果 A 中的文件或文件夹被重命名,B 中相应的文件或文件夹也需要进行重命名。
  3. 同步删除的文件和文件夹:如果 A 中的文件或文件夹被删除,B 中相应的文件或文件夹也需要删除。

以下是实现该功能的一个代码示例:

C# 示例代码

using System;
using System.IO;

public static class DirectorySync
{
    public static void SyncDirectories(string sourceDir, string targetDir)
    {
        // 1. 确保目标目录存在
        if (!Directory.Exists(targetDir))
        {
            Directory.CreateDirectory(targetDir);
        }

        // 2. 同步文件夹
        foreach (string sourceSubDir in Directory.GetDirectories(sourceDir))
        {
            string dirName = Path.GetFileName(sourceSubDir);
            string targetSubDir = Path.Combine(targetDir, dirName);

            if (!Directory.Exists(targetSubDir))
            {
                // 复制不存在的文件夹
                Directory.CreateDirectory(targetSubDir);
            }

            // 递归同步子文件夹
            SyncDirectories(sourceSubDir, targetSubDir);
        }

        // 3. 删除目标路径中多余的文件夹
        foreach (string targetSubDir in Directory.GetDirectories(targetDir))
        {
            string dirName = Path.GetFileName(targetSubDir);
            string correspondingSourceSubDir = Path.Combine(sourceDir, dirName);

            if (!Directory.Exists(correspondingSourceSubDir))
            {
                // 删除在目标路径中存在但在源路径中不存在的文件夹
                Directory.Delete(targetSubDir, true);
            }
        }

        // 4. 同步文件
        foreach (string sourceFilePath in Directory.GetFiles(sourceDir))
        {
            string fileName = Path.GetFileName(sourceFilePath);
            string targetFilePath = Path.Combine(targetDir, fileName);

            if (!File.Exists(targetFilePath))
            {
                // 复制不存在的文件
                File.Copy(sourceFilePath, targetFilePath);
            }
            else
            {
                // 如果文件存在但内容不同,则更新文件
                FileInfo sourceFileInfo = new FileInfo(sourceFilePath);
                FileInfo targetFileInfo = new FileInfo(targetFilePath);

                if (sourceFileInfo.LastWriteTime > targetFileInfo.LastWriteTime)
                {
                    File.Copy(sourceFilePath, targetFilePath, true);
                }
            }
        }

        // 5. 删除目标路径中多余的文件
        foreach (string targetFilePath in Directory.GetFiles(targetDir))
        {
            string fileName = Path.GetFileName(targetFilePath);
            string correspondingSourceFilePath = Path.Combine(sourceDir, fileName);

            if (!File.Exists(correspondingSourceFilePath))
            {
                // 删除在目标路径中存在但在源路径中不存在的文件
                File.Delete(targetFilePath);
            }
        }
    }

    static void Main()
    {
        string sourceDir = @"C:\Path\To\Source\A"; // 源路径 A
        string targetDir = @"C:\Path\To\Target\B"; // 目标路径 B

        SyncDirectories(sourceDir, targetDir);

        Console.WriteLine("同步完成");
    }
}

代码说明

  1. 确保目标目录存在

    • 如果目标目录 B 不存在,使用 Directory.CreateDirectory(targetDir) 创建它。
  2. 同步文件夹

    • 遍历源路径 A 的所有子文件夹。
    • 如果目标路径 B 中不存在对应的子文件夹,则创建它。
    • 使用递归方式确保所有层级的子文件夹都得到同步。
  3. 删除目标路径中多余的文件夹

    • 遍历目标路径 B 的所有子文件夹。
    • 如果这些子文件夹在源路径 A 中不存在,则删除它们。
  4. 同步文件

    • 遍历源路径 A 中的所有文件。
    • 如果目标路径 B 中不存在相应的文件,则将源文件复制过去。
    • 如果文件已经存在,但源文件的 LastWriteTime 比目标文件的新,说明源文件有更新,则替换目标文件。
  5. 删除多余的文件

    • 遍历目标路径 B 中的所有文件。
    • 如果这些文件在源路径 A 中不存在,则删除它们。

优化和扩展

  1. 重命名检测

    • 上述代码不会明确处理重命名的情况,它会认为源路径中不存在对应的文件或文件夹,因此删除旧的并重新复制新的。
    • 如果需要保留重命名记录并高效同步,可以考虑使用文件和文件夹的唯一标识(如 ID 或 Hash 值),这超出了简单的同步逻辑,需要更复杂的数据记录和对比机制。
  2. 日志和错误处理

    • 添加日志记录每个文件和文件夹的同步操作,可以方便调试。
    • 添加异常处理,以确保在某些操作失败时不会中断整个同步过程。
  3. 效率提升

    • 对于大型目录结构,频繁的文件遍历和复制操作可能会导致性能问题。可以考虑使用增量同步工具,避免每次都全量遍历。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/906744.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c++文件操作中的seekp函数使用方法

seekp函数能设置输出流的位置 比如我先向文件输入了123456&#xff0c;现在我想在第四个字符后面再加上ABC&#xff0c;这个时候我们就可以用seekp函数来设置输出的位置 #include <iostream> #include <fstream> #include <string>using namespace std;int …

Python小白学习教程从入门到入坑------第二十三课 封装(语法进阶)

面向对象的三大特征&#xff1a;封装、继承、多态 一、封装 1.1 何为封装 封装&#xff1a;在Python中指的是隐藏对象中一些不希望被外部所访问到的属性或者方法。将复杂的信息、流程给包起来&#xff0c;内部处理&#xff0c;让使用者只需要通过简单的操作步骤&#xff0c;…

less解决function中return写法在浏览器被识别成Object导致样式失败的问题

问题描述&#xff1a; 一开始写的是: baseFontSize: 37.5px;//基于屏幕尺寸/10得出的基准font-size// return失败,浏览器显示为[object Object],[object Object] .pxToRem(px){value: px / baseFontSize * 1rem;return value; } 使用height: .pxToRem(40px);之后浏览器却是这…

OpenCV视觉分析之目标跟踪(4)目标跟踪类TrackerDaSiamRPN的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::TrackerDaSiamRPN 是 OpenCV 中用于目标跟踪的一个类&#xff0c;它实现了 DaSiam RPN&#xff08;Deformable Siamese Region Proposal Net…

高效视频制作大提速,视频剪辑软件的高级自定义命令功能批量调整视频的色调、饱和度和亮度,轻松驾驭视频编辑技巧

在浩瀚的数字海洋中&#xff0c;视频如同璀璨的星辰&#xff0c;而每一颗星辰都渴望被精心雕琢&#xff0c;闪耀出最独特的光芒。想象一下&#xff0c;你手握一把神奇的钥匙&#xff0c;能够轻松解锁批量视频剪辑的奥秘&#xff0c;让每一帧画面都跃动着你的创意与激情。这把钥…

Vue3入门--[vue/compiler-sfc] Unexpected token, expected “,“ (18:0)

新手小白学习Vue–入门就踩坑系列 问题描述 创建了一个Person.vue&#xff0c;保存后直接报错&#xff1a; [plugin:vite:vue] [vue/compiler-sfc] Unexpected token, expected "," (18:0) 在网上搜了半天也没找到原因&#xff0c;最后还得靠自己&#xff0c;现将解…

【制造业&盒子】箱子检测系统源码&数据集全套:改进yolo11-swintransformer

改进yolo11-MLCA等200全套创新点大全&#xff1a;箱子检测系统源码&#xff06;数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.11.01 注意&#xff1a;由于项目一直在更新迭代&#xff0c;上面“1.图片效果展示”和“2.视频效果展示”展示的系统图片或者视频可能为…

Spring Security 框架篇-深入了解 Spring Security 的认证功能流程和自定义实现登录接口(实现自定义认证过滤器、登出功能)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 Spring Security 框架概述 2.0 Spring Security 核心功能-认证功能 2.1 过滤器链 2.2 登录认证流程 2.3 思路分析 3.0 登录认证具体操作 3.1 环境搭建 3.2 实现 U…

HBuilderx修改主题色-改变编辑器背景颜色等

效果图&#xff1a; 第一步我们打开HBuilderX 选择工具 – 主题 – 选择&#xff08;雅蓝&#xff09; 然后再设置&#xff0c;源码视图里面打开Setting.json文件 3.将一下代码赋值到右侧用户设置即可 {"workbench.colorCustomizations": {// "[Defau…

食堂采购系统源码:实现供应链管理平台功能模块的技术实践

在当前数字化转型浪潮中&#xff0c;餐饮和食堂管理的需求越来越高&#xff0c;食堂采购系统逐渐成为企业和组织优化管理、降低成本的关键工具。 一、食堂采购系统的核心功能概述 一个完善的食堂采购系统不仅需要具备传统的订单管理、库存管理、供应商管理功能&#xff0c;还…

Python 工具库每日推荐 【Sphinx】

文章目录 引言文档工具的重要性今日推荐:Sphinx 文档生成工具主要功能:使用场景:安装与配置快速上手示例代码代码解释实际应用案例案例:为 Python 项目生成 API 文档案例分析高级特性自定义主题国际化支持扩展阅读与资源优缺点分析优点:缺点:总结【 已更新完 TypeScript …

stm32不小心把SWD和JTAG都给关了,程序下载不进去,怎么办?

因为想用STM32F103的PA15引脚&#xff0c;调试程序的时候不小心把SWD和JTAD接口都给关了&#xff0c;先看下罪魁祸首 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//关掉JTAG&#xff0c;不关SWGPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);//关掉SW&am…

Transformer+KAN系列时间序列预测代码

前段时间&#xff0c;来自 MIT 等机构的研究者提出了一种非常有潜力的替代方法 ——KAN。该方法在准确性和可解释性方面表现优于 MLP。而且&#xff0c;它能以非常少的参数量胜过以更大参数量运行的 MLP。 KAN的发布&#xff0c;引起了AI社区大量的关注与讨论&#xff0c;同时…

【OD-支持在线评测】文本统计分析(200分)

📎 在线评测链接 https://app5938.acapp.acwing.com.cn/contest/11/problem/OD1076 🍓 OJ题目截图 🍿 最新机试E卷,全、新、准,题目覆盖率达 95% 以上,支持题目在线评测,专栏文章质量平均 94 分 🌍 评测功能需要 ⇒ 订阅专栏 ⇐ 后私信联系解锁~ 文章目录 📎…

C++(友元、异常机制、静态成员、单例模式)

友元 友元可以访问与其好友关系的类中的私有成员&#xff0c;使用friend关键字进行修饰。&#xff08;友元破坏了类的封装性&#xff09;。 特点 &#xff08;1&#xff09;友元是单向的 &#xff08;2&#xff09;友元不能传递 &#xff08;3&#xff09;友元…

HTML 基础标签——表格标签<table>

文章目录 1. `<table>` 标签:定义表格2. `<tr>` 标签:定义表格行3. `<th>` 标签:定义表头单元格4. `<td>` 标签:定义表格单元格5. `<caption>` 标签:为表格添加标题6. `<thead>` 标签:定义表格头部7. `<tbody>` 标签:定义表格…

ElementUI中el-table双击单元格显示输入框

效果图 实现 <el-table:data"formData.products"row-key"id":show-header"true"style"width: 100%; margin-top: 16px"class"zq-table-theme-info"bordercell-dblclick"handleDbClick"> <el-table-col…

强化学习之父Richard Sutton给出一个简单思路,大幅增强所有RL算法

在当今的大模型时代&#xff0c;以 RLHF 为代表的强化学习方法具有无可替代的重要性&#xff0c;甚至成为了 OpenAI ο1 等模型实现强大推理能力的关键。 但这些强化学习方法仍有改进空间。近日&#xff0c;强化学习之父、阿尔伯塔大学教授 Richard Sutton 的团队低调更新了一…

一台手机可以登录运营多少个TikTok账号?

很多TikTok内容创作者和商家通过运营多个账号来实现品牌曝光和产品销售&#xff0c;这种矩阵运营方式需要一定的技巧和设备成本&#xff0c;那么对于很多新手来说&#xff0c;一台手机可以登录和运营多少个TikTok账号呢&#xff1f; 一、运营TikTok账号的数量限制 TikTok的官…

Rembg模型构建教程

一、介绍 Rembg&#xff0c;全称为“Remove Background”&#xff0c;是一款基于深度学习的图像背景去除工具。它的主要功能是通过智能识别图像中的前景物体&#xff0c;并将其从背景中分离出来&#xff0c;从而创建具有透明背景的图像。 二、基础环境 系统&#xff1a;Ubun…