当前位置:  编程技术>.net/c#/asp.net

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

    来源: 互联网  发布时间:2014-10-27

    本文导语:  代码如下:using System;using System.Collections.Generic;using System.IO;using System.Text;using System.Text.RegularExpressions;namespace AutoSync{    public class NewDirectory    {        public static Dictionary GetDirectories(string dirname)        {           ...

代码如下:

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
namespace AutoSync
{
    public class NewDirectory
    {
        public static Dictionary GetDirectories(string dirname)
        {
            Dictionary dirs = new Dictionary();
            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 Log = new List();
        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 SDirInfo = new Dictionary();
            Dictionary DDirInfo = new Dictionary();
            Dictionary aa = new Dictionary();
            SDirInfo = NewDirectory.GetDirectories(sourcedir);//获取源目录的目录信息
            DDirInfo = NewDirectory.GetDirectories(destdir);//获取目标目录的目录信息
            //
            //      开始同步两个目录,但只先同步源目录信息
            //------比较两目录中的子目录信息---------------------
            foreach (KeyValuePair 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;
        }
    }
}


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C++ I/O 成员 sync_with_stdio():同标准I/O同步
  • 除了用现成的线程同步函数之外,能否自己写线程同步函数?
  • python下用os.execl执行centos下的系统时间同步命令ntpdate
  • linux时钟为何与BIOS时钟不同步?如何使其同步?
  • Linux下时钟同步问题:Clock skew detected原因分析及解决方法
  • discuz免激活同步登入代码修改方法(discuz同步登录)
  • Linux下用ntpdate同步时间及date显示设置时间
  • 内核同步?
  • 跨平台的文件同步工具 Capivara
  • 信息同步工具 SyncMate
  • 高清视频同步播放控制器 HDSync
  • NTP时间同步
  • 如何在一段程序同步几个变量??
  • linux服务器之间如何实现时间同步?
  • 日历同步统计 GCALDaemon
  • 数据同步和复制解决方案 SymmetricDS
  • linux虚拟机时间与windows时间如何同步
  • 集群同步工具 Csync2
  • 目录同步工具 DirSync
  • 文件夹比较和同步工具 FreeFileSync
  • 关于邮件系统同步的问题,高手请进


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3