博客园里面有很多同步工具和软件,关于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多次文件触发事件(源码)的更多相关文章

  1. 支持语音识别、自然语言理解的微信小程序(“遥知之”智能小秘)完整源码分享

    记录自己搭建https的silk录音文件语音识别服务的调用过程,所有代码可在文中找链接打包下载 >>>>>>>>>>>>> ...

  2. Qt中QPushButton、QTabWidget等部件内容文字换行的解决方法(一定要写在源码里,写在翻译文件里不行,因为\n得不到转义)

    最近在做基于Qt的应用项目,其中有一个按钮文字超长,需要换一行显示.从网上找到的建议都是将要显示的内容做成图片,然后将图片设置为该按钮的背景.但是这样做有一个很大的局限性,当需要更改内容文字的时候,需 ...

  3. 【全网首创】修改 Ext.ux.UploadDialog.Dialog 源码支持多选添加文件,批量上传文件

    公司老框架的一个页面需要用到文件上传,本以为修改一个配置参数即可解决,百度一番发现都在说这个第三方插件不支持文件多选功能,还有各种各样缺点,暂且不讨论这些吧.先完成领导安排下来的任务. 任务一:支持多 ...

  4. .38-浅析webpack源码之读取babel-loader并转换js文件

    经过非常非常长无聊的流程,只是将获取到的module信息做了一些缓存,然后生成了loaderContext对象. 这里上个图整理一下这节的流程: 这一节来看webpack是如何将babel-loade ...

  5. golang 源码文件

    Go源码文件分三个种类: 1)命令源码文件:如果一个源码文件被声明属于main代码包,且该文件代码中包含无参数声明和结果声明的main函数,则它就是命令源码文件.命令源码文件可以通过go run命令直 ...

  6. class文件的基本结构及proxy源码分析二

    前文地址:https://www.cnblogs.com/tera/p/13267630.html 本系列文章主要是博主在学习spring aop的过程中了解到其使用了java动态代理,本着究根问底的 ...

  7. C#开发的高性能EXCEL导入、导出工具DataPie(支持MSSQL、ORACLE、ACCESS,附源码下载地址)[转]

    转自:http://www.cnblogs.com/yfl8910/archive/2012/05/19/2509194.html 作为财务数据核算人员,面对大量的业务与财务数据,借助于传统的EXCE ...

  8. 修改sqlarchemy源码使其支持jdbc连接mysql

    注意:本文不会将所有完整源码贴出,只是将具体的思路以及部分源码贴出,需要感兴趣的读者自己实验然后实现吆. 缘起 公司最近的项目需要将之前的部分业务的数据库连接方式改为jdbc,但由于之前的项目都使用s ...

  9. 优化Recorder H5录音:可边录边转码上传服务器,支持微信提供Android IOS Hybrid App源码

    Recorder H5 GitHub开源库随着支持功能的增多,音频转码处理效率渐渐的跟不上需求了,近期抽时间对音频转码部分进行了升级优化,以支持更多实用的功能. 另外IOS的Hybrid App也完成 ...

随机推荐

  1. Java传参那些事!

    刚刚学习java传参的时候很纠结,也非常的不理解!课本上的“按值传递”和“按址传递”搞的自己是一头雾水,后来写的项目多了,自然就明白了! 现在写传参几乎就是条件反射一般——“秒成”,分享当初自己为此写 ...

  2. pl/sql developer 编码格式设置

    pl/sql developer编码格式设置   一.pl/sql developer 中文字段显示乱码  原因:因为数据库的编号格式和pl /sql developer的编码格式不统一造成的. 二. ...

  3. SQL Server 外键约束的例子

    外键约束的测试表与测试数据 -- 创建测试主表. ID 是主键. CREATE TABLE test_main ( id INT, value ), PRIMARY KEY(id) ); -- 创建测 ...

  4. Clear All of Them I(HDU 3920状压dp)

    题意:给有2*n个敌人的位置,枪在(0,0)位置,一次能消灭两个敌人,耗费能量为枪到一个敌人,由这个敌人再到另个敌人的的距离和,求消灭所有敌人最小耗费能量. 分析:一次枚举状态的两位即可 #inclu ...

  5. NBUT1457 Sona 莫队算法

    由于10^9很大,所以先离散化一下,把给你的这一段数哈希 时间复杂度O(nlogn) 然后就是分块莫队 已知[L,R],由于事先的离散化,可以在O(1)的的时间更新[l+1,r],[l,r+1],[l ...

  6. 发布代码小助手V2.1发布了——Code2HTML工具

    设计起源: 新浪博客似乎没有插入代码的功能,所以不得不用打空格的方法格式化代码.而且没法显示行号. 描述: 发布代码小助手用python和Tkinter开发,可以在任何常见操作系统上运行.主要用于在不 ...

  7. VBScript: Windows脚本宿主介绍

    Windows脚本宿主(Windows Script Host, WSH)是一个Windows管理工具.WSH创建了一个脚本运行的主环境,WSH使脚本能够使用对象和服务,并提供脚本执行的准则.WSH还 ...

  8. 容斥原理——uva 10325 The Lottery

    首先推荐一篇介绍容斥原理很好的博客http://www.cppblog.com/vici/archive/2011/09/05/155103.html 题意:求1~n中不能被给定m个数中任意一个数整除 ...

  9. 设置IE浏览器代理上网

    在局域网中,服务器可以直接通过IE网上冲浪,而工作站要想通过IE上网,如果是在服务器使用代理软件的情况下,其IE需要设置代理. 步骤一:启动IE浏览器,选择"工具",再" ...

  10. 第九章、文件与文件系统的压缩与打包 Linux 系统常见的压缩命令

    Linux 系统常见的压缩命令: 在Linux中,压缩文件的扩展名大多是:『*.tar, *.tar.gz, *.tgz, *.gz, *.Z, *.bz2』 Linux 支持的压缩命令非常多,且不同 ...