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

时间:2022-01-25 05:03:03 


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

标签:两个文件夹同步
0
投稿

猜你喜欢

  • 通过实例深入了解java序列化

    2022-12-01 17:37:39
  • 详解使用Spring3 实现用户登录以及权限认证

    2023-05-07 03:59:12
  • Java集合之Map接口的实现类精解

    2023-10-07 15:10:37
  • 基于web项目log日志指定输出文件位置配置方法

    2021-10-04 09:25:27
  • 学习Java设计模式之观察者模式

    2023-07-03 05:17:46
  • java判断字符串是否有逗号的方法

    2021-11-03 08:01:23
  • Java编程中ArrayList源码分析

    2023-05-20 00:05:25
  • J2ee 高并发情况下监听器实例详解

    2022-12-26 05:47:43
  • 基于list stream: reduce的使用实例

    2021-07-21 06:54:52
  • Java中finally和return的关系实例解析

    2023-05-31 04:21:31
  • C#定时关闭窗体实例

    2023-07-09 22:53:25
  • 详解Java中Callable和Future的区别

    2023-07-25 21:18:58
  • java清除u盘内存卡里的垃圾文件示例

    2023-05-12 06:41:38
  • Android上传文件到服务端并显示进度条

    2023-06-23 07:48:33
  • Spring Data JPA 之 JpaRepository的使用

    2023-11-24 21:23:40
  • 设置Android系统永不锁屏永不休眠的方法

    2021-06-28 12:01:21
  • C#串口通信模块使用方法示例

    2023-06-19 12:13:57
  • Android 通过代码安装 APK的方法详解

    2022-11-12 14:37:26
  • Java中lambda表达式实现aop切面功能

    2022-12-02 09:44:59
  • 利用C#9.0新语法如何提升if语句美感

    2021-06-15 12:48:54
  • asp之家 软件编程 m.aspxhome.com