定时自动同步文件,支持多文件夹同步,支持过滤文件和文件夹,解决FileSystemWatcher多次文件触发事件(源码)
博客园里面有很多同步工具和软件,关于FileSystemWatcher类解释的也很多,但收集了很多文章后,感觉没好的方法,自己没事写了一个定时文件同步,借鉴了很多博客园朋友的东西:
上主菜:
配置文件:
<appSettings>
<!--原地址(多地址;隔开)-->
<add key="OldAddress" value="F:\bakup\1;F:\bakup\3"/>
<!--目标地址-->
<add key="NewAddress" value="F:\bakup\2"/>
<!--自动同步时间一般晚上23点开始-->
<add key="syncTime" value="23"/>
<!--要过滤的文件夹(多文件名;隔开)-->
<add key="FiltrationFile" value="Error"/>
<!--要过滤的文件后缀(多后缀;隔开)-->
<add key="FiltrationSuffix" value="log"/>
</appSettings>
FileSystemWatcher类的Changed事件在每次文件添加和修改的时候,都会触发多次,不晓得微软为什么会有这样的考虑,我看博客园很多人给的解决方案是记录文件写入时间,同一文件写入文件不得小于500ns;
lock (dict)
{
//过滤文件夹
if (FiltrationFile(e.FullPath)) return;
//过滤文件后缀
if (FiltrationSuffix(e.Name)) return;
if (dict.ContainsKey(e.FullPath))
{
if ((new FileInfo(e.FullPath).LastWriteTime - dict[e.FullPath]).TotalMilliseconds <= ) //同一文件写入时间不得小于500ns
return;
else
dict.Remove(e.FullPath);
}
if (e.ChangeType == WatcherChangeTypes.Changed)
{
if (e.ChangeType == WatcherChangeTypes.Deleted)
{
return;
}
//判断文件是否存在.
if (System.IO.File.Exists(e.FullPath) == true)
{
dict.Add(e.FullPath, new FileInfo(e.FullPath).LastWriteTime);
Task task = new Task(() =>
{
FileSave(e.Name, e.FullPath);
});
task.Start();
}
System.Threading.Thread.Sleep();
}
}
在同步文件的时候,还有一个问题就是用户文件正在上传,这个触发Change事件都会报错,这个时候需要验证文件是否完整:
/// <summary>
/// 判断文件是否完整
/// </summary>
/// <param name="path"></param>
private void Waiting(string path)
{
lock (this)
{
while (true)
{
try
{
FileStream stream = File.OpenRead(path);
stream.Close();
stream.Dispose();
return;
}
catch
{ System.Threading.Thread.Sleep();
}
}
}
}
在一些项目中,一些日志文件或则一些固定的文件夹是不需要同步的,这都需要验证文件路径是否包含不同的文件夹和文件:
/// <summary>
/// 过滤文件夹
/// </summary>
private bool FiltrationFile(string fullPath)
{
try
{
string file = GetAppConfig("FiltrationFile");
if (string.IsNullOrEmpty(file)) return false;
file = file.ToLower();
if (File.Exists(fullPath) == true)
{
string[] items = file.Split(';');
List<string> list = fullPath.ToLower().Split('\\').ToList();
list.RemoveAt(list.Count - );
for (int i = ; i < items.Length; i++)
{
if (list.Count(a => a == items[i]) > )
{
return true;
}
}
}
}
catch (Exception exp)
{
WriteLog(exp.Message);
}
return false;
} /// <summary>
/// 过滤文件名后缀
/// </summary>
private bool FiltrationSuffix(string fileName)
{
try
{
string file = GetAppConfig("FiltrationSuffix");
if (string.IsNullOrEmpty(file)) return false;
file = file.ToLower();
string suffix = fileName.ToLower().Substring(fileName.LastIndexOf('.') + );
string[] items = file.Split(';');
for (int i = ; i < items.Length; i++)
{
if (items[i] == suffix)
{
return true;
}
}
}
catch (Exception exp)
{
WriteLog(exp.Message);
}
return false;
}
源码地址:http://files.cnblogs.com/xchit/SyncFile.rar(如果有更好的解决方法可以交流)
定时自动同步文件,支持多文件夹同步,支持过滤文件和文件夹,解决FileSystemWatcher多次文件触发事件(源码)的更多相关文章
- 支持语音识别、自然语言理解的微信小程序(“遥知之”智能小秘)完整源码分享
记录自己搭建https的silk录音文件语音识别服务的调用过程,所有代码可在文中找链接打包下载 >>>>>>>>>>>>> ...
- Qt中QPushButton、QTabWidget等部件内容文字换行的解决方法(一定要写在源码里,写在翻译文件里不行,因为\n得不到转义)
最近在做基于Qt的应用项目,其中有一个按钮文字超长,需要换一行显示.从网上找到的建议都是将要显示的内容做成图片,然后将图片设置为该按钮的背景.但是这样做有一个很大的局限性,当需要更改内容文字的时候,需 ...
- 【全网首创】修改 Ext.ux.UploadDialog.Dialog 源码支持多选添加文件,批量上传文件
公司老框架的一个页面需要用到文件上传,本以为修改一个配置参数即可解决,百度一番发现都在说这个第三方插件不支持文件多选功能,还有各种各样缺点,暂且不讨论这些吧.先完成领导安排下来的任务. 任务一:支持多 ...
- .38-浅析webpack源码之读取babel-loader并转换js文件
经过非常非常长无聊的流程,只是将获取到的module信息做了一些缓存,然后生成了loaderContext对象. 这里上个图整理一下这节的流程: 这一节来看webpack是如何将babel-loade ...
- golang 源码文件
Go源码文件分三个种类: 1)命令源码文件:如果一个源码文件被声明属于main代码包,且该文件代码中包含无参数声明和结果声明的main函数,则它就是命令源码文件.命令源码文件可以通过go run命令直 ...
- class文件的基本结构及proxy源码分析二
前文地址:https://www.cnblogs.com/tera/p/13267630.html 本系列文章主要是博主在学习spring aop的过程中了解到其使用了java动态代理,本着究根问底的 ...
- C#开发的高性能EXCEL导入、导出工具DataPie(支持MSSQL、ORACLE、ACCESS,附源码下载地址)[转]
转自:http://www.cnblogs.com/yfl8910/archive/2012/05/19/2509194.html 作为财务数据核算人员,面对大量的业务与财务数据,借助于传统的EXCE ...
- 修改sqlarchemy源码使其支持jdbc连接mysql
注意:本文不会将所有完整源码贴出,只是将具体的思路以及部分源码贴出,需要感兴趣的读者自己实验然后实现吆. 缘起 公司最近的项目需要将之前的部分业务的数据库连接方式改为jdbc,但由于之前的项目都使用s ...
- 优化Recorder H5录音:可边录边转码上传服务器,支持微信提供Android IOS Hybrid App源码
Recorder H5 GitHub开源库随着支持功能的增多,音频转码处理效率渐渐的跟不上需求了,近期抽时间对音频转码部分进行了升级优化,以支持更多实用的功能. 另外IOS的Hybrid App也完成 ...
随机推荐
- 在 Azure 中使用公用 IP 创建多 NIC VM
Russ Slaten 2014年 11 月 18日下午 4点 我们最近宣布了支持具有多个网络接口控制器 (NIC) 的虚拟机 (VM).我仍在努力了解此功能适用的所有新场景,但首先,我希望亲自测试 ...
- apache开源项目--Mavibot
Mavibot™ 是个Java 的多版本并发控制 BTree,是 JDBM(当前 Apache Directory 服务器的后端)的替代品, 但是有着更强的功能,能适应任意需要实现 Java MVCC ...
- 【转】编译Android系统源码和内核源码
原文网址:http://blog.csdn.net/jiangwei0910410003/article/details/37988637 好长时间没有写blog了,之所以没有写,主要还是工作上的事, ...
- 关于word2010中完美解决数学公式(正斜体)输入的解决方案
测试环境 win10(64位) office2010(32位)——64位的没有测试,估计应该也可以. 需要软件(包)(请按照下面顺序安装) ①VC运行库(自行百度下载即可) ②北大方正word公式数学 ...
- javascript设计模式8
桥接模式(将抽象与其实现隔离开来,以便二者独立变化) function sendInfo(element){ var id=element.id; ajax("GET"," ...
- dataStructure@ Find if there is a path between two vertices in a directed graph
Given a Directed Graph and two vertices in it, check whether there is a path from the first given ve ...
- 秒杀 ILSpy 等反编译利器 DotNet Resolver
http://dotnetresolver.eu5.org/downloads.html DotNet Resolver is a free .NET decompiler written in C# ...
- python 递归函数
在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 举个例子,我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact(n)表示,可以看出: f ...
- [Objective-c 基础 - 2.1] 封装
A.封装内部细节,根据需求暴露方法 #import <Foundation/Foundation.h> @interface Student : NSObject { int age; } ...
- [置顶] Effective STL 学习笔记
看Effective STL 作的一些笔记,希望对各位有帮助. 以下是50条条款及相关解释. 容器 1. 慎重选择容器类型,根据需要选择高效的容器类型. 2. 不要试图编写独立于容器类型的代码. 3. ...