1,上章节讲了文件定时同步,如何实现的方向;这节我们进行文件实时同步的功能讲解。
2,想要实时同步,我们考虑的方向就是对主机要同步的文件进行实时监控,如果有变化就进行实时同步更新到备用机对应的目录下。这里就要使用到C#里自带的文件监控类FileSystemWatcher。使用该类对需要同步的文件进行检测,如果出现变动则同步对应的文件给备用机。这样实现出来的效果几乎无延时同步文件给备用机。
3,下面我们示例为自己开发的一个FileSystemWatcher监控的辅助类,可以直接使用。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RHA
{
public class CFileWatcher
{
private FileSystemWatcher _watcher = null;
private string _path = string.Empty;
private string _target = string.Empty;
private string _filter = string.Empty;
private bool _isWatch = false;
/// <summary>
/// 监控是否正在运行
/// </summary>
public bool IsWatch
{
get
{
return _isWatch;
}
}
/// <summary>
/// 监控文件
/// </summary>
/// <param name="path"></param>
/// <param name="target"></param>
public CFileWatcher(string path,string target)
{
_path = path;
_target = target;
}
/// <summary>
/// 打开文件监听器
/// </summary>
public void Open()
{
if (!Directory.Exists(_path))
{
Directory.CreateDirectory(_path);
}
if (string.IsNullOrEmpty(_filter))
{
_watcher = new FileSystemWatcher(_path);
}
else
{
_watcher = new FileSystemWatcher(_path, _filter);
}
_watcher.Created += new FileSystemEventHandler(OnProcess);
_watcher.Changed += new FileSystemEventHandler(OnProcess);
_watcher.Deleted += new FileSystemEventHandler(OnProcess);
_watcher.Renamed += new RenamedEventHandler(OnFileRenamed);
_watcher.IncludeSubdirectories = true;
_watcher.EnableRaisingEvents = true;
_isWatch = true;
}
/// <summary>
/// 关闭监听器
/// </summary>
public void Close()
{
_isWatch = false;
_watcher.Created -= new FileSystemEventHandler(OnProcess);
_watcher.Changed -= new FileSystemEventHandler(OnProcess);
_watcher.Deleted -= new FileSystemEventHandler(OnProcess);
_watcher.Renamed -= new RenamedEventHandler(OnFileRenamed);
_watcher.EnableRaisingEvents = false;
_watcher = null;
}
/// <summary>
/// 监听事件触发的方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnProcess(object sender, FileSystemEventArgs e)
{
try
{
if (e.ChangeType == WatcherChangeTypes.Created)
{
//处理创建的时候copy
CFilesOpration.Instance.CopyDirectory(_path, _target);
}
else if (e.ChangeType == WatcherChangeTypes.Changed)
{
CFilesOpration.Instance.CopyDirectory(_path, _target);
}
else if (e.ChangeType == WatcherChangeTypes.Deleted)
{
CFilesOpration.Instance.CopyDirectory(_path, _target);
}
}
catch
{
Close();
}
}
/// <summary>
/// 文件或目录重命名时触发的事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnFileRenamed(object sender, RenamedEventArgs e)
{
try
{
CFilesOpration.Instance.CopyDirectory(_path, _target);
}
catch
{
Close();
}
}
}
}
4,CopyDirectory方法可以参考上章节定时同步的说明。
欢迎大家留言和交流!!!