欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

c#同步两个子目录文件示例分享 两个文件夹同步

程序员文章站 2024-02-14 23:55:34
复制代码 代码如下:using system;using system.collections.generic;using system.io;using system.t...

复制代码 代码如下:

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;
        }
    }
}