using System;using System.Collections.Generic;using System.IO;using System.Text;namespace 同步文件{ enum SyncResult { Success, SourceDirNotExists, DestDirNotExists } class FloderSync { public int CreateDirCount = 0; public int CopyFileCount = 0; public List<string> Log = new List<string>(); private void AddLog(string logtext) { if (Log.Count < 1000) Log.Add(System.DateTime.Now.ToString() logtext); else if (Log.Count == 1000) Log.Add(System.DateTime.Now.ToString() " 达到日志上限,不再追加"); } public SyncResult StartSync(string sourcedir, string destdir) { //传入目录名保护 sourcedir = sourcedir.Trim(); destdir = destdir.Trim(); //保证目录最后一个字符不是斜杠 if (sourcedir[sourcedir.Length - 1] == '\\') sourcedir = sourcedir.Remove(sourcedir.Length - 1); if (destdir[destdir.Length - 1] == '\\') destdir = destdir.Remove(destdir.Length - 1); //判断目录是否存在 if (!Directory.Exists(sourcedir)) return SyncResult.SourceDirNotExists; if (!Directory.Exists(destdir)) return SyncResult.DestDirNotExists; //获取源、目的目录内的目录信息 Dictionary<string, string> SDirInfo = new Dictionary<string, string>(); Dictionary<string, string> DDirInfo = new Dictionary<string, string>(); Dictionary<string, string> aa = new Dictionary<string, string>(); SDirInfo = NewDirectory.GetDirectories(sourcedir);//获取源目录的目录信息 DDirInfo = NewDirectory.GetDirectories(destdir);//获取目标目录的目录信息 // // 开始同步两个目录,但只先同步源目录信息 //------比较两目录中的子目录信息--------------------- foreach (KeyValuePair<string, string> kvp in SDirInfo) //在查找有无源目录存在而在目标目录中不存在的目录 { if (!DDirInfo.ContainsKey(kvp.Key)) //如果目标目录中不存在目录,则马上建立 { string dirname = destdir "\\" kvp.Key; Directory.CreateDirectory(dirname); AddLog(" 创建目录:" dirname); CreateDirCount ; } //递归调用目录同步函数,实现嵌套目录一次性全同步 StartSync(sourcedir "\\" kvp.Key, destdir "\\" kvp.Key); } //取得源目录下所有文件的列表 string[] SFiles = Directory.GetFiles(sourcedir); //string[] DFiles = Directory.GetFiles(destdir); //------比较两目录中的文件信息(本层目录)-------------- foreach (string sfilename in SFiles) { string dfilename = destdir "\\" Path.GetFileName(sfilename); if (File.Exists(dfilename)) //如果目的目录中已经存在同名文件,则比较其最后修改时间,取最新的为准 { //取得源、目的目录中同名文件的文件信息 FileInfo sfi = new FileInfo(sfilename); FileInfo dfi = new FileInfo(dfilename); //如果源文件大于目的文件修改时间5秒以上才拷贝覆盖过去,主要是考虑到操作系统的一些差异,对于修改时间相同而文件大小不同的文件则暂不处理 if (sfi.LastWriteTime > dfi.LastWriteTime.AddSeconds(5)) { //拷贝源目录下的同名文件到目的目录 File.Copy(sfilename, dfilename, true); AddLog(" 覆盖文件:" dfilename); CopyFileCount ; } } else //如果目的目录中不存在同名文件,则拷贝过去 { //拷贝源目录下的同名文件到目的目录 File.Copy(sfilename, dfilename, true); AddLog(" 拷贝文件:" dfilename); CopyFileCount ; } } return SyncResult.Success; } public SyncResult CopySync(string sourcedir, string destdir) { //传入目录名保护 sourcedir = sourcedir.Trim(); destdir = destdir.Trim(); //保证目录最后一个字符不是斜杠 if (sourcedir[sourcedir.Length - 1] == '\\') sourcedir = sourcedir.Remove(sourcedir.Length - 1); if (destdir[destdir.Length - 1] == '\\') destdir = destdir.Remove(destdir.Length - 1); //判断目录是否存在 if (!Directory.Exists(sourcedir)) return SyncResult.SourceDirNotExists; if (!Directory.Exists(destdir)) return SyncResult.DestDirNotExists; //获取源、目的目录内的目录信息 Dictionary<string, string> SDirInfo = new Dictionary<string, string>(); Dictionary<string, string> DDirInfo = new Dictionary<string, string>(); Dictionary<string, string> aa = new Dictionary<string, string>(); SDirInfo = NewDirectory.GetDirectories(sourcedir);//获取源目录的目录信息 DDirInfo = NewDirectory.GetDirectories(destdir);//获取目标目录的目录信息 // // 开始同步两个目录,但只先同步源目录信息 //------比较两目录中的子目录信息--------------------- foreach (KeyValuePair<string, string> kvp in SDirInfo) //在查找有无源目录存在而在目标目录中不存在的目录 { if (!DDirInfo.ContainsKey(kvp.Key)) //如果目标目录中不存在目录,则马上建立 { string dirname = destdir "\\" kvp.Key; Directory.CreateDirectory(dirname); AddLog(" 创建目录:" dirname); CreateDirCount ; } //递归调用目录同步函数,实现嵌套目录一次性全同步 CopySync(sourcedir "\\" kvp.Key, destdir "\\" kvp.Key); } //取得源目录下所有文件的列表 string[] SFiles = Directory.GetFiles(sourcedir); //string[] DFiles = Directory.GetFiles(destdir); //------比较两目录中的文件信息(本层目录)-------------- foreach (string sfilename in SFiles) { FileInfo fi = new FileInfo(sfilename); if (fi.LastWriteTime > DateTime.Now.AddDays(-3)) { string dfilename = destdir "\\" Path.GetFileName(sfilename); if (File.Exists(dfilename)) //如果目的目录中已经存在同名文件,则比较其最后修改时间,取最新的为准 { //取得源、目的目录中同名文件的文件信息 FileInfo sfi = new FileInfo(sfilename); FileInfo dfi = new FileInfo(dfilename); //如果源文件大于目的文件修改时间5秒以上才拷贝覆盖过去,主要是考虑到操作系统的一些差异,对于修改时间相同而文件大小不同的文件则暂不处理 if (sfi.LastWriteTime > dfi.LastWriteTime.AddSeconds(5)) { //拷贝源目录下的同名文件到目的目录 File.Copy(sfilename, dfilename, true); AddLog(" 覆盖文件:" dfilename); CopyFileCount ; } } else //如果目的目录中不存在同名文件,则拷贝过去 { //拷贝源目录下的同名文件到目的目录 File.Copy(sfilename, dfilename, true); AddLog(" 拷贝文件:" dfilename); CopyFileCount ; } } } return SyncResult.Success; } }}
下载C# 异步同步文件(移动拷贝文件) 实例源码下载用户还喜欢
- 18480 文章数
- 500万+ 热度
作者专栏
编辑推荐
- 淡抹u2引擎,修复内容较多,物有所值
- 界域传说·经典巨作=传世单机(一键安装)
- 丸子版本(175个传世版本大集合)
- GS版本:神话公益服务端+客户端
- 图片放大工具(放大图片不模糊)
- 剪映无限制VIP版
- 传奇世界客户端下载器,史上最全传世客户端
- 传世GS20220920商业引擎注册+登录配置器 解压密码是1
- U2官方排行榜游戏网关 支持元神,支持传家宝
- GS开战传世客户端+服务端
- (淡漠夕阳)u2引擎合区工具
- 传世GS引擎消除“你的游戏客户端版本号过旧,请及时更新”提示
- 传世一机多区双线路配置器--免密码版本
- 传世凤凰登陆器劫持修复软件
- SQLite3 for Navicat
- 传奇世界npc对话框编辑工具
- 传世GS落霞铭文服务器端
- gs_20210409引擎包+注册机(无限制)
- 传奇世界NPC对话封包查看器[支持时长版和极速版]
- 彩虹引擎传世脚本编辑工具1.7版来了,支持函数脚本翻译
评论