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


猜你喜欢
- 本文实例讲述了C#文件合并的方法。分享给大家供大家参考。具体实现方法如下:using System;using System.IO;stri
- 在移动支付领域,支付宝支付占用巨大份额,根据艾瑞咨询公布的报告数据:2014Q3,支付宝斩
- 这一篇主要是用来介绍关于C#中的XML序列化的问题,这个相信大家一定会经常使用它,特别是在WPF中,有时候我们需要将我们后台的数据保存在数据
- 首先,来看一下,快速排序的实现的动态图:快速排序介绍:快速排序,根据教科书说法来看,是冒泡排序的一种改进。快速排序,由一个待排序的数组(ar
- 什么是 MyBatis 缓存使⽤缓存可以减少 Java 应⽤与数据库的交互次数,从而提升程序的运行效率。⽐如查询出 id = 1 的对象,第
- C#配置文件操作类,供大家参考,具体内容如 * 意添加引用:System.Configuration;using System; using
- java获取map中value最大值public static void main(String[] args) throws Interr
- 今天我们来讲一下Android中BroadcastReceiver的相关知识。BroadcastReceiver也就是“广播接收者”的意思,
- 一、前言本博文标题和内容参考:基于原生JS实现H5转盘游戏博主将改编成Unity版本。二、效果图三、案例制作1.界面搭建使用了9个图片作为奖
- 基本思想基数排序(RadixSort)是在桶排序的基础上发展而来的,两种排序都是分配排序的高级实现。分配排序(DistributiveSor
- 现在很多流行的框架,都可以很快的把分页效果做出来,但是作为一名程序员你必须得知道手写分页的流程:场景效果:一、分页的思路首先我们得知道写分页
- 一、导言1.1 介绍桥接模式及其应用背景桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以
- 1 引入 pom 包<dependency> <groupId>io.github.res
- 为什么要使用路由在之前我们的代码中,页面跳转使用的代码如下所示:Navigator.of(context).push( Mate
- 本文实例讲述了Java编程实现统计一个字符串中各个字符出现次数的方法。分享给大家供大家参考,具体如下:import java.util.It
- 在编写ui界面时因为手机分辨率大小不同,所以展现出来的效果也是不同的,这个时候就需要考虑适配器,让根据手机分辨率自动适配相应尺寸来展示界面,
- 一、前言 网上有许多的多线程断点续传操作,但总是写的很云里雾里,或者
- java 中设计模式(值对象)的实例详解应用场景:在Java开发时,需要来回交换大量的数据,比如要为方法传入参数,也要获取方法的返回值,该如
- trim标记是一个格式化的标记,可以完成set或者是where标记的功能,如下代码:1、select * from user <tri
- 智能指针(auto_ptr) 这个名字听起来很酷是不是?其实auto_ptr 只是C++标准库提供的一个类模板,它与传统的new/delet