乐于分享
好东西不私藏

C# 文件夹同步工具:双向备份重要数据,再也不怕文件丢失!

C# 文件夹同步工具:双向备份重要数据,再也不怕文件丢失!

😫 你有没有遇到过这种崩溃瞬间?

昨晚加班到11点改好的方案,今早一看——文件夹里还是旧版本!或者公司电脑突然蓝屏,U盘里的备份还是三个月前的……这种感觉,真的想掀桌子。

更要命的是,每次”手动备份”都是个体力活:打开源文件夹,复制,找到备份目录,粘贴,确认覆盖……一套下来没个10分钟搞不定,还容易漏文件。

💡 今天这篇文章,就是专门帮你解决这个问题的。 咱们用C#写一个“文件夹双向同步小工具”,配合VSCode和通义灵码AI插件,零基础也能5分钟搞定,从此让电脑自动帮你备份,再也不用手动复制粘贴!

🎁 读完这篇,你将拥有:一个可以双向同步两个文件夹的自动化小工具,随时运行,立马见效。


🎬 第一章:真实场景还原——你是不是也这样?

咱们来说说小李的故事。小李是某公司的行政专员,每天下班前都要把当天的工作文件从”工作电脑”同步到”备份U盘”,再从”家用电脑”把昨晚在家改的文件同步回来。

算一笔账:

操作
每次耗时
每月耗时
手动复制工作文件夹
约10分钟
约200分钟
核对哪些文件是新的
约5分钟
约100分钟
处理重名冲突
约3分钟
约60分钟
合计 约18分钟/天 约360分钟/月

每个月白白浪费6小时! 这还没算漏备份、覆盖错文件的心理损耗。

手工操作最大的坑就是:你永远不知道哪个文件是最新的。 时间一长,两个文件夹里的内容就乱成一锅粥,根本理不清。


💡 第二章:解决方案预览——看看效果有多爽

Before(手动时代):打开资源管理器 → 一个个对比文件日期 → 手动复制 → 祈祷没漏文件 → 耗时15分钟+

After(用了这个小工具):双击运行 → 自动扫描两个文件夹 → 自动同步最新文件 → 完成!耗时不到30秒 ✅

🧰 咱们要用到的工具

  • • VSCode:写代码的地方,免费、好用,就像一个超级记事本
  • • 通义灵码插件:阿里出的AI编程助手,会帮咱们自动生成代码,装上就能用
  • • .NET 10:让C#代码能直接运行的“发动机”,免费下载

💪 别担心,这三样东西全部免费,安装过程比装微信还简单,你肯定行!


🔧 第三章:环境准备——5分钟装好,一次搞定

📦 第一步:安装 VSCode

前往 code.visualstudio.com 下载 Windows 版本,双击安装包,一路”下一步”就行,全程不到3分钟。

💡 安装时勾选”添加到右键菜单”,以后右键文件夹直接用VSCode打开,超方便!

📦 第二步:安装 .NET 10

前往 dotnet.microsoft.com 下载 .NET 10 SDK(选Windows x64版本),双击安装,全程默认设置。

安装完成后,按 Win + R,输入 cmd 打开命令行,输入:

dotnet --version

如果显示 10.x.x,说明安装成功了!🎉

📦 第三步:安装通义灵码插件

打开VSCode,点击左侧边栏的”扩展”图标(四个小方块),搜索 “TONGYI Lingma”,点击安装,然后登录你的阿里云账号(没有就免费注册一个)。

安装完成后,VSCode右下角会出现通义灵码的图标,说明AI助手已经上线待命了!✅


🚀 第四章:手把手实战——用AI帮咱们写代码

📝 第一步:新建项目文件

在你的电脑上新建一个文件夹,比如叫 FolderSync。用VSCode打开这个文件夹(文件 → 打开文件夹)。

在文件夹里新建一个文件,命名为 sync.cs

🤖 第二步:让通义灵码帮咱们写代码

这是最神奇的一步!点击VSCode右侧的通义灵码图标,打开AI对话窗口,把下面这段AI提示词直接复制进去发送:

请帮我用C# .NET 10编写一个文件夹双向同步工具,要求:1. 使用顶级语句(Top-level statements),不需要类和Main方法,直接运行.cs文件2. 支持双向同步:比较两个文件夹中同名文件的最后修改时间,自动将较新的文件复制到另一边3. 源文件夹中有但目标文件夹没有的文件,自动复制过去(双向都要做)4. 每次同步操作都在控制台打印日志,说明复制了哪个文件、从哪里到哪里5. 在代码顶部用变量定义两个文件夹路径,方便用户修改6. 每一行代码都要有详细的中文注释7. 程序运行结束后显示同步完成的统计信息(共同步了多少个文件)

通义灵码会自动生成完整代码。把生成的代码复制到 sync.cs 文件里。

🔥 这就是AI提示词编程的魔力! 你不需要懂C#语法,只需要用大白话告诉AI你想要什么,它就帮你写好代码。

📝 完整脚本代码(通义灵码生成版)

下面是通义灵码根据上面提示词生成的完整代码,你可以直接复制使用:

using System; // 引入系统基本命名空间,提供基础类型和控制台操作功能using System.IO; // 引入文件输入输出命名空间,提供文件和目录操作类using System.Linq; // 引入 LINQ 命名空间,提供集合查询和扩展方法using System.Collections.Generic; // 引入通用集合命名空间,提供列表等泛型集合类// 定义第一个同步文件夹的路径,用户可修改此变量指向实际目录string folderA = @"D:\FolderA"// 设置文件夹 A 的根目录绝对路径字符串// 定义第二个同步文件夹的路径,用户可修改此变量指向实际目录string folderB = @"D:\FolderB"// 设置文件夹 B 的根目录绝对路径字符串// 初始化同步计数器变量,用于记录本次程序运行期间同步的文件总数int syncCount = 0// 定义整型变量并初始化为 0 用于统计// 获取文件夹 A 中所有文件的完整路径列表,包含子目录var filesA = Directory.GetFiles(folderA, "*.*", SearchOption.AllDirectories); // 递归检索文件夹 A 下所有文件// 将文件夹 A 的文件绝对路径转换为相对于根目录的相对路径列表filesA = filesA.Select(path => path.Substring(folderA.Length).TrimStart('\\')); // 截取路径字符串去除根目录部分// 将查询结果转换为列表类型以便后续多次遍历使用var listA = filesA.ToList(); // 将 IEnumerable 转换为 List 集合// 获取文件夹 B 中所有文件的完整路径列表,包含子目录var filesB = Directory.GetFiles(folderB, "*.*", SearchOption.AllDirectories); // 递归检索文件夹 B 下所有文件// 将文件夹 B 的文件绝对路径转换为相对于根目录的相对路径列表filesB = filesB.Select(path => path.Substring(folderB.Length).TrimStart('\\')); // 截取路径字符串去除根目录部分// 将查询结果转换为列表类型以便后续多次遍历使用var listB = filesB.ToList(); // 将 IEnumerable 转换为 List 集合// 合并两个文件列表的相对路径,获取所有需要处理的唯一文件路径var allPaths = listA.Union(listB).ToList(); // 取并集操作去除重复路径并转为列表// 遍历每一个唯一的相对文件路径进行同步逻辑判断foreach (var relativePath in allPaths) // 开始循环遍历所有文件相对路径// 开始 foreach 循环代码块// 组合文件夹 A 的路径和相对路径生成文件在 A 中的完整绝对路径string pathA = Path.Combine(folderA, relativePath); // 使用 Path 类合并路径字符串// 组合文件夹 B 的路径和相对路径生成文件在 B 中的完整绝对路径string pathB = Path.Combine(folderB, relativePath); // 使用 Path 类合并路径字符串// 检查该文件是否实际存在于文件夹 A 中bool existsInA = File.Exists(pathA); // 调用 File 类方法判断文件是否存在// 检查该文件是否实际存在于文件夹 B 中bool existsInB = File.Exists(pathB); // 调用 File 类方法判断文件是否存在// 判断文件是否仅存在于文件夹 A 中(B 中不存在)if (existsInA && !existsInB) // 条件判断:A 存在且 B 不存在    { // 开始 if 条件代码块// 获取文件在文件夹 B 中的目标目录路径string destDirB = Path.GetDirectoryName(pathB); // 提取文件路径中的目录部分// 确保文件夹 B 中的目标子目录存在,不存在则创建        Directory.CreateDirectory(destDirB); // 创建所有必要的父目录// 执行文件复制操作,将文件从 A 复制到 B        File.Copy(pathA, pathB); // 复制文件内容到目标路径// 在控制台打印日志信息,记录本次复制操作的详情        Console.WriteLine($"[同步] 复制文件:{relativePath} (从 A 到 B)"); // 输出格式化字符串到控制台// 同步计数器加一,记录成功同步了一个文件        syncCount++; // 变量自增操作    } // 结束 if 条件代码块// 判断文件是否仅存在于文件夹 B 中(A 中不存在)elseif (!existsInA && existsInB) // 条件判断:A 不存在且 B 存在    { // 开始 else if 条件代码块// 获取文件在文件夹 A 中的目标目录路径string destDirA = Path.GetDirectoryName(pathA); // 提取文件路径中的目录部分// 确保文件夹 A 中的目标子目录存在,不存在则创建        Directory.CreateDirectory(destDirA); // 创建所有必要的父目录// 执行文件复制操作,将文件从 B 复制到 A        File.Copy(pathB, pathA); // 复制文件内容到目标路径// 在控制台打印日志信息,记录本次复制操作的详情        Console.WriteLine($"[同步] 复制文件:{relativePath} (从 B 到 A)"); // 输出格式化字符串到控制台// 同步计数器加一,记录成功同步了一个文件        syncCount++; // 变量自增操作    } // 结束 else if 条件代码块// 判断文件是否在两个文件夹中都存在elseif (existsInA && existsInB) // 条件判断:A 和 B 都存在    { // 开始 else if 条件代码块// 获取文件在文件夹 A 中的最后写入时间        DateTime timeA = File.GetLastWriteTime(pathA); // 读取文件属性中的修改时间// 获取文件在文件夹 B 中的最后写入时间        DateTime timeB = File.GetLastWriteTime(pathB); // 读取文件属性中的修改时间// 比较两个时间,如果 A 的时间晚于 B,说明 A 是较新的文件if (timeA > timeB) // 条件判断:A 的时间大于 B        { // 开始内部 if 条件代码块// 执行文件复制操作,用 A 覆盖 B,允许覆盖现有文件            File.Copy(pathA, pathB, true); // 复制文件并设置 overwrite 参数为 true// 在控制台打印日志信息,记录本次更新操作的详情            Console.WriteLine($"[同步] 更新文件:{relativePath} (从 A 到 B,A 较新)"); // 输出格式化字符串到控制台// 同步计数器加一,记录成功同步了一个文件            syncCount++; // 变量自增操作        } // 结束内部 if 条件代码块// 比较两个时间,如果 B 的时间晚于 A,说明 B 是较新的文件elseif (timeB > timeA) // 条件判断:B 的时间大于 A        { // 开始内部 else if 条件代码块// 执行文件复制操作,用 B 覆盖 A,允许覆盖现有文件            File.Copy(pathB, pathA, true); // 复制文件并设置 overwrite 参数为 true// 在控制台打印日志信息,记录本次更新操作的详情            Console.WriteLine($"[同步] 更新文件:{relativePath} (从 B 到 A,B 较新)"); // 输出格式化字符串到控制台// 同步计数器加一,记录成功同步了一个文件            syncCount++; // 变量自增操作        } // 结束内部 else if 条件代码块// 如果两个文件时间相同,说明文件内容可能一致,无需操作else// 条件判断:时间相等        { // 开始内部 else 条件代码块// 此处无需执行任何操作,跳过该文件// 无操作 // 文件状态一致不需要同步        } // 结束内部 else 条件代码块    } // 结束外部 else if 条件代码块// 结束 foreach 循环代码块// 所有文件遍历完成后,输出分隔线以便区分日志和统计信息Console.WriteLine("--------------------------------"); // 输出字符串作为视觉分隔符// 输出最终的同步统计信息,显示总共处理了多少个文件Console.WriteLine($"同步完成,共处理文件:{syncCount} 个"); // 输出格式化字符串显示统计结果

运行dotnet 出错,将错误信息copy到提示词输入框,再次运行如下

会自动修改syn.cs脚本,运行完成后,dotnet syn.cs

执行成功了


🚀 第三步:修改路径,改成你自己的

找到代码里这两行,把路径换成你自己的:

string folderA = @"C:\Users\你的用户名\Documents\工作文件";string folderB = @"D:\备份\工作文件备份";

💡 怎么找到正确路径? 打开文件资源管理器,进入你想同步的文件夹,点击顶部地址栏,路径就显示出来了,直接复制过来就行!

⭐ 注意:路径前面有个 @ 符号,别删掉!它的作用是让反斜杠 \ 不报错。

🚀 第四步:运行小工具

按 Ctrl + ~ 打开VSCode的终端(就是下方的命令行窗口),输入:

dotnet sync.cs

看到控制台输出同步日志,说明成功了!🎉


⚠️ 第五章:常见问题解答——遇到坑别慌

🔴 报错:”找不到路径”检查路径是否正确,注意路径里不能有中文引号(""),必须是英文引号("")。直接从资源管理器复制路径最保险。

🔴 报错:”dotnet不是内部命令”说明 .NET 10 没装好,或者安装后没重启命令行。关掉VSCode重新打开,再试一次。

🔴 运行后什么都没同步很正常!说明两个文件夹已经是同步状态了。试着在文件夹A里新建一个测试文件,再运行一次,就能看到效果。

🔴 路径里有空格怎么办?没问题,用 @"..." 格式写路径,空格完全不影响。

🔴 权限不够,复制失败右键VSCode图标,选”以管理员身份运行”,再试一次。


🎨 第六章:个性化定制——让工具更贴合你的需求

想同步子文件夹里的文件?

把 Directory.GetFiles(folderA) 改成:

Directory.GetFiles(folderA, "*", SearchOption.AllDirectories)

加上 SearchOption.AllDirectories 这个参数,就能递归扫描所有子文件夹,一层一层都同步到!

只想同步特定类型的文件?

比如只同步Word文档:

Directory.GetFiles(folderA, "*.docx")

把 * 换成 *.docx*.xlsx*.pdf 等,就只同步对应类型的文件了。

想定时自动同步?

可以把这个 .cs 文件配合Windows的”任务计划程序”使用——设置每天早上9点自动运行,彻底解放双手,完全不用手动触发。


✅ 结尾总结——你今天学到了什么

🎯 三大收获

  1. 1. 学会了:用通义灵码AI插件,用一段大白话提示词,就能生成完整的C#同步工具代码
  2. 2. 解决了:文件夹手动备份费时费力、容易漏文件、搞不清哪个版本最新的老大难问题
  3. 3. 节省了:每次备份从15分钟压缩到30秒,一个月省下好几个小时

🚀 现在就行动:把代码复制进去,改两行路径,运行一次,今天就能开始享受自动备份的安心感!

这个小工具虽然代码不多,但它背后的思路——用AI提示词编程,描述需求让AI写代码——才是真正值得你掌握的超能力。以后遇到任何重复性的工作,都可以用同样的方式,让AI帮你”造工具”。

🤝 你还有哪些重复性工作想自动化? 欢迎在评论区告诉我,咱们一起搞定它!遇到问题也别慌,评论区求助,大家一起帮你解决!

💝 觉得有用的话,收藏这篇文章,下次遇到文件备份问题直接翻出来用。分享给还在手动备份的同事朋友,让大家都能享受自动化的便利!

本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » C# 文件夹同步工具:双向备份重要数据,再也不怕文件丢失!

猜你喜欢

  • 暂无文章