C# 兩個目錄同步的代碼

cymt 9年前發布 | 3K 次閱讀 C#

C# 兩個目錄同步的代碼

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

}</pre>

 本文由用戶 cymt 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!