基本信息
源码名称:C# 异步同步文件(移动拷贝文件) 实例源码下载
源码大小:0.04M
文件格式:.rar
开发语言:C#
更新时间:2017-03-21
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):78630559
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
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;
}
}
}