zl程序教程

您现在的位置是:首页 >  后端

当前栏目

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

c#文件同步 示例 分享 两个 文件夹 子目录
2023-06-13 09:15:16 时间

复制代码代码如下:


usingSystem;
usingSystem.Collections.Generic;
usingSystem.IO;
usingSystem.Text;
usingSystem.Text.RegularExpressions;
namespaceAutoSync
{
   publicclassNewDirectory
   {
       publicstaticDictionary<string,string>GetDirectories(stringdirname)
       {
           Dictionary<string,string>dirs=newDictionary<string,string>();
           string[]strDirs=Directory.GetDirectories(dirname);
           foreach(stringstrinstrDirs)
           {
               string[]result=str.Split("\\");
               dirs.Add(result[result.Length-1],result[result.Length-1]);
           }
           returndirs;
       }
   }
}

复制代码代码如下:


usingSystem;
usingSystem.Collections.Generic;
usingSystem.IO;
usingSystem.Text;

namespaceAutoSync
{
   enumSyncResult
   {
       Success,SourceDirNotExists,DestDirNotExists
   }
   classFloderSync
   {
       publicintCreateDirCount=0;
       publicintCopyFileCount=0;
       publicList<string>Log=newList<string>();
       privatevoidAddLog(stringlogtext)
       {
           if(Log.Count<1000)
               Log.Add(System.DateTime.Now.ToString()+logtext);
           elseif(Log.Count==1000)
               Log.Add(System.DateTime.Now.ToString()+" 达到日志上限,不再追加");
       }
       publicSyncResultStartSync(stringsourcedir,stringdestdir)
       {
           //传入目录名保护
           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))returnSyncResult.SourceDirNotExists;
           if(!Directory.Exists(destdir))returnSyncResult.DestDirNotExists;

           //获取源、目的目录内的目录信息
           Dictionary<string,string>SDirInfo=newDictionary<string,string>();
           Dictionary<string,string>DDirInfo=newDictionary<string,string>();
           Dictionary<string,string>aa=newDictionary<string,string>();
           SDirInfo=NewDirectory.GetDirectories(sourcedir);//获取源目录的目录信息
           DDirInfo=NewDirectory.GetDirectories(destdir);//获取目标目录的目录信息
           //
           //     开始同步两个目录,但只先同步源目录信息
           //------比较两目录中的子目录信息---------------------
           foreach(KeyValuePair<string,string>kvpinSDirInfo)//在查找有无源目录存在而在目标目录中不存在的目录
           {
               if(!DDirInfo.ContainsKey(kvp.Key))//如果目标目录中不存在目录,则马上建立
               {
                   stringdirname=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(stringsfilenameinSFiles)
           {
               stringdfilename=destdir+"\\"+Path.GetFileName(sfilename);
               if(File.Exists(dfilename))//如果目的目录中已经存在同名文件,则比较其最后修改时间,取最新的为准
               {
                   //取得源、目的目录中同名文件的文件信息
                   FileInfosfi=newFileInfo(sfilename);
                   FileInfodfi=newFileInfo(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++;
               }
           }
           returnSyncResult.Success;
       }
   }
}