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

(0)

相关推荐

  • C#获取项目指定目录下文件的方法

    本文实例讲述了C#获取项目指定目录下文件的方法.分享给大家供大家参考.具体如下: public List<FileInfo> GetFiles() { string path = string.Concat(System.AppDomain.CurrentDomain.BaseDirectory,"Files\\"); //获取项目物理路径 string[] fileType=new string[]{"pdf\\","pps\\",

  • C#遍历指定目录下所有文件的方法

    本文实例讲述了C#遍历指定目录下所有文件的方法.分享给大家供大家参考.具体分析如下: 先通过DirectoryInfo打开指定的目录,然后通过GetFiles()方法读取文件夹下的所有文件 DirectoryInfo di = new DirectoryInfo(@"C:\mydir"); Console.WriteLine("Directory: {0}", di.FullName); foreach (FileInfo file in di.GetFiles()

  • C#实现最完整的文件和目录操作类实例

    本文实例讲述了C#实现最完整的文件和目录操作类.分享给大家供大家参考.具体如下: using System; using System.Text; using System.IO; namespace HelloCsharp.Utilities { /// <summary> /// 文件操作类 /// </summary> public static class DirFile { #region 检测指定目录是否存在 /// <summary> /// 检测指定目录

  • C#读取目录下所有指定类型文件的方法

    本文实例讲述了C#读取目录下所有指定类型文件的方法.分享给大家供大家参考.具体分析如下: 首先要引入命名空间:using System.IO; 再写读取方法: DirectoryInfo dir = new DirectoryInfo(path); //path为某个目录,如: "D:\Program Files" FileInfo[] inf = dir.GetFiles(); foreach (FileInfo finf in inf) { if( finf.Extension.E

  • C#操作目录与文件的方法步骤

    • 创建目录和文件1.通过Path类的Combine方法可以合并路径. 复制代码 代码如下: string activeDir = @"C:\myDir";string newPath = System.IO.Path.Combine(activeDir, "mySubDirOne"); 2.目录的创建.创建目录时如果目录已存在,则不会重新创建目录,且不会报错.创建目录时会自动创建路径中各级不存在的目录.(1)通过Directory类的CreateDirectory

  • C#删除文件目录或文件的解决方法

    复制代码 代码如下: /// 删除文件和目录public class Cleaner
{
   ///   /// 删除指定目录以及该目录下所有文件   ///   /// 欲删除文件或者目录的路径
     public static void Clean ( string dir )
{
          CleanFiles ( dir );//第一次删除文件
          CleanFiles ( dir );//第二次删除目录
     }

private static vo

  • C#计算两个文件的相对目录算法的实例代码

    楼主大菜鸟一只,第一次写技术博客,如果有概念错误或代码不规范的地方,还请各位多多批评指正.话不多说,来看题: 前一阵子开发了一个用户控件,里面调用了很多css,js等资源文件,而引用控件的页面所在目录是不同的.问题出来了:如果目录不同,那么控件里引用css,js资源文件的路径也会相应变化.现在已知两个文件相对于网站根目录的路径,如何计算相对路径呢?请看代码: 复制代码 代码如下: public string GetRelativePath(string path1, string path2){

  • C#实现安全删除文件目录的方法

    本文实例讲述了C#实现安全删除文件目录的方法.分享给大家供大家参考.具体分析如下: 1. 创建文件夹 (简单,没多考虑) 2. 删除所建文件夹:为防止删除过程中有其他进程引用该文件夹中文件,增加了对此意外情况的考虑. 在本例中,若删除过程中被其他进程引用,等待并循环5次尝试再次删除操作.长时间无法被删除,则删除文件目录失败 using System; using System.IO; namespace Retry { class Program { static void Main(strin

  • C#如何打开并读取usb的文件目录

    下面我通过一个小例子并结合一段代码片段给大家展示下,有需要的朋友可以来借鉴下. 界面上拖一个 button 和treeview  ,运行的时候直接插入优盘,单机按钮就会出现目录文件.不过只能在u盘插入,U盘拔出时,才能接收到信息. 1.[C#]代码 using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; usi

  • C#实现Zip压缩目录中所有文件的方法

    本文实例讲述了C#实现Zip压缩目录中所有文件的方法.分享给大家供大家参考.具体实现方法如下: using System; using System.IO; using System.Collections; using System.IO.Compression; using System.Collections.Generic; class FolderZip { private const long BUFFER_SIZE = 20480; static void main(string[

  • C#文件目录操作方法汇总

    需要 using System.IO; 1) 相对路径转绝对路径 string fullfolder = HttpContext.Current.Server.MapPath(folder); 2) 文件移动(改名) File.Move(Server.MapPath("/a.txt"), Server.MapPath("/b.txt")); 3) 文件复制 File.Copy(Server.MapPath("/a.txt"), Server.Ma

  • C#获取全部目录和文件的简单实例

    复制代码 代码如下: public class FileAccess{ //储存所有文件夹名private ArrayList dirs; public FileAccess(){dirs = new ArrayList();} //获取所有文件名private ArrayList GetFileName(string dirPath){ArrayList list = new ArrayList(); if (Directory.Exists(dirPath)){list.AddRange(D

  • C#常用目录文件操作类实例

    本文实例讲述了C#常用目录文件操作类.分享给大家供大家参考.具体分析如下: 这个c#类封装了常用的目录操作,包括列出目录下的文件.检测目录是否存在.得到目录下的文件列表.检测目录是否为空.查找目录下的文件等等功能 using System; using System.Text; using System.IO; namespace DotNet.Utilities { /// <summary> /// 文件操作夹 /// </summary> public static clas

  • c#使用filesystemwatcher实时监控文件目录的添加和删除

    首先,我们需要对.net提供的FileSystemWatcher类有所了解.我有些懒,找了MSDN对该类的描述. FileSystemWatcher类侦听文件系统更改通知,并在目录或目录中的文件发生更改时引发事件. 使用 FileSystemWatcher 监视指定目录中的更改.可监视指定目录中的文件或子目录的更改.可以创建一个组件来监视本地计算机.网络驱动器或远程计算机上的文件. 若要监视所有文件中的更改,请将 Filter 属性设置为空字符串 ("") 或使用通配符("*

随机推荐