博客园里面有很多同步工具和软件,关于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. angularjs的事件 $broadcast and $emit and $on

    angularjs的事件 $broadcast and $emit and $on <!DOCTYPE html> <html> <head> <meta c ...

  2. ↗☻【HTML5秘籍 #BOOK#】第4章 Web表单

    from元素用于组织所有表单部件,负责告诉浏览器把数据提交到哪里,方法是在action属性中提供一个URL.假如你只想在客户端使用JavaScript操作表单,那么只要在action属性中指定一个#即 ...

  3. ps一般常用的快捷键

    jpg 不支持透明和半透明 :网页中的大图,高清图(体积大) gif 支持透明 不支持半透明 :网页中的小图标(动画图片)png8 支持透明 不支持半透明 :网页中的小图标png24 支持透明 支持半 ...

  4. Peer to Peer File Sharing Through WCF

    http://www.codeproject.com/Articles/614028/Peer-to-Peer-File-Sharing-Through-WCF https://github.com/ ...

  5. ASP.NET使用Jquery-Ajax向ashx传递参数中文出现乱码

    今天遇到个问题,IE11下Jquery-Ajax向ashx传递参数中文出现乱码,但在谷歌.火狐.360等浏览器中没有乱码的问题,百度了好久最后发现使用escape()对参数值进行处理就可以了: 参考代 ...

  6. sys.stdout 重定向

    通俗的来说,sys.stdout的功能类似与C++里面的文件输出功能fprintf. 接下来直接入正题,让我们来看代码: >>> import sys >>> te ...

  7. POJ 1005 解题报告

    1.题目描述   2.解题思路 好吧,这是个水题,我的目的暂时是把poj第一页刷之,所以水题也写写吧,这个题简单数学常识而已,给定坐标(x,y),易知当圆心为(0,0)时,半圆面积为0.5*PI*(x ...

  8. 11个高级MySQL数据库面试问题和答案

    因为有大家的支持,我们才能做到现在,感谢你们这一路上对我们的支持.在这篇文章中,我们将主要针对MySQL的实用技巧,讲讲面试中相关的问题. 1. 如何使用SELECT语句找到你正在运行的服务器的版本并 ...

  9. TCP/IP协议栈及OSI参考模型详解

    OSI参考模型 OSI RM:开放系统互连参考模型(open systeminterconnection reference model) OSI参考模型具有以下优点: 简化了相关的网络操作: 提供设 ...

  10. 转载 DevOps的基本原则与介绍

    转载原地址:  http://www.cnblogs.com/wintersun/p/3339047.html DevOps的基本原则与介绍 DevOps这个术语是developer与operatio ...