c#同步两个子目录文件示例分享 两个文件夹同步
using system;
using system.collections.generic;
using system.io;
using system.text;
using system.text.regularexpressions;
namespace autosync
{
public class newdirectory
{
public static dictionary<string,string> getdirectories(string dirname)
{
dictionary<string, string> dirs = new dictionary<string, string>();
string[] strdirs = directory.getdirectories(dirname);
foreach (string str in strdirs)
{
string[] result = str.split('\\');
dirs.add(result[result.length-1], result[result.length-1]);
}
return dirs;
}
}
}
using system;
using system.collections.generic;
using system.io;
using system.text;
namespace autosync
{
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;
}
}
}