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;
}
}
}
猜你喜欢
- 第一节 接口慨述接口(interface)用来定义一种程序的协定。实现接口的类或者结构要与接口的定义严格一致。有了这个协定,就可以抛开编程语
- 我就废话不多说了,大家还是直接看代码吧~<!-- 查询物品的id --><select id="checkIte
- 气球状提示框的介绍和系统通知变化NotifyIcon控件表示系统右下角任务栏上的托盘图标,其ShowBalloonTip方法用于显示任务栏中
- 在定义API的时候,对于一些返回集合对象的方法,很多人喜欢将返回类型定义成IEnumerable<T>,这本没有什么问题。这里要
- 字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。深刻认识Stri
- 提示:IntelliJ IDEA以下简称IDEA;####IntelliJ IDEA 配置git:需要的材料:一、git.exe二、配置gi
- 前言本文主要介绍了关于spring boot中servlet启动过程与原理的相关内容,下面话不多说了,来一起看看详细的介绍吧启动过程与原理:
- 说明本实例能够监控聚划算的抢购按钮,在聚划算整点聚的时间到达时自动弹开页面(URL自己定义)。可以自定义监控持续分钟数,同时还可以通过多线程
- 一、引言在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文
- 前言以下内容科班同学学过UML和数据库的应该比较熟悉数据模型:数据模型是对数据库特征的抽象,也就是用户从数据库中看到的模型,例如一张数据表或
- Spring Bean的生命周期?首先说一下Servlet的生命周期:实例化,初始init,接收请求service,销毁destroy;Sp
- SpringBoot切面拦截@PathVariable参数及抛出异常的全局处理微信小程序的接口验证防止非法请求,登录的时候获取openId生
- 1、什么是集合框架?在java中,有一套现成的数据结构,例如顺序表,链表,队列,栈,优先级队列,哈希表等,被封装成了相应的接口/类,供程序员
- Java常用类包装类由于Java语言中的基本类型不是面向对象,并不具备对象的性质,实际使用存在很多不便。Java在java.lang包中提供
- 重复参数 Scala在定义函数时允许指定最后一个参数可以重复(变长参数),从而允许函数调用者使用变长参数列表来调用该函数,Scala中使用“
- 本文实例为大家分享了struts2实现文件上传下载的具体实现代码,供大家参考,具体内容如下一、文件上传 struts提交的文件组件上传, 前
- 写完js倒计时,突然想用java实现倒计时,写了三种实现方式一:设置时长的倒计时;二:设置时间戳的倒计时;三:使用java.util.Tim
- 本文实例讲述了C#中数组初始化、反转和排序用法。分享给大家供大家参考。具体如下:下面的代码演示了在C#中定义和初始化数组,然后对其进行赋值,
- 1. 概述官方JavaDocsApi: java.awt.Component,java.awt.Containernull,绝对布局。绝对布
- 通过使用java mail来实现读取163邮箱,qq邮箱的邮件内容。1.代码实现创建springboot项目,引入依赖包<!--mai