当前位置: 首页 > news >正文

异步拷贝文件

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

 

转载于:https://www.cnblogs.com/libbybyron/p/6598653.html

相关文章:

  • 用lua实现ByteArray和ByteArrayVarint
  • 作业2
  • 缓冲区溢出漏洞(2)
  • Visual Studio VS如何重置所有设置
  • Twirp:一个很酷的基于Go的新RPC框架
  • Nginx+Tomcat搭建高性能负载均衡集群
  • 我的第一篇博客
  • 我讲个事情哈,编程其实是文科
  • 基于Docker和Debian打造个人专属操作系统
  • thinkphp在前端页面的js代码中可以使用 U方法吗? 可以使用模板变量如__URL__等吗?...
  • 编写符合Python风格的对象
  • 二叉树基础之序列化和反序列化二叉树
  • 数组作业
  • Linux进程管理
  • Spring系列之-Aware系列接口
  • Angular 响应式表单之下拉框
  • JavaScript实现分页效果
  • Java多态
  • mysql innodb 索引使用指南
  • PAT A1050
  • python学习笔记-类对象的信息
  • Redash本地开发环境搭建
  • socket.io+express实现聊天室的思考(三)
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • Spark学习笔记之相关记录
  • SpiderData 2019年2月25日 DApp数据排行榜
  • vue中实现单选
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 学习使用ExpressJS 4.0中的新Router
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • #Ubuntu(修改root信息)
  • $.ajax()方法详解
  • $.ajax中的eval及dataType
  • (1)SpringCloud 整合Python
  • (python)数据结构---字典
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (附源码)计算机毕业设计ssm电影分享网站
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (九)信息融合方式简介
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (数据结构)顺序表的定义
  • (转)memcache、redis缓存
  • (转)详解PHP处理密码的几种方式
  • .htaccess配置常用技巧
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • .NET业务框架的构建
  • @Valid和@NotNull字段校验使用
  • []T 还是 []*T, 这是一个问题
  • []常用AT命令解释()
  • [100天算法】-x 的平方根(day 61)
  • [Angular 基础] - 指令(directives)
  • [codevs 1515]跳 【解题报告】
  • [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated c