You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

156 lines
5.7 KiB
C#

using ServiceStack.Messaging;
using System;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.Unicode;
using Txgy.RBS.Framework.Models;
namespace Txgy.RBS.Framework.FileWatcherHelper
{
public class FilesWatcherService
{
public FilesWatcherService(int proId, string projectName, string path)
{
projectId = proId;
proName = projectName;
watcherPath = path;
// string filter = "*.txt";
// WatcherPath = AppDomain.CurrentDomain.BaseDirectory;
// InitializeParams(filter, watcherPath);
}
private string watcherPath;
public string WatcherPath
{
get { return watcherPath; }
}
private string proName;
public string ProName
{
get { return proName; }
}
private int projectId;
public int ProjectId
{
get { return projectId; }
}
public DateTime StartTime { get; set; }
public void Start()
{
WatchStartOrSopt(true);
StartTime = DateTime.Now;
}
public void Stop()
{
WatchStartOrSopt(false);
}
public Action<MsEventModel, FileSystemEventArgs> WatcherFileChanged;
public void InitializeParams(string fileFilter="*.index")
{
//如果设置的目录不存在设置到根目录
if (!File.Exists(watcherPath))
{
Directory.CreateDirectory(watcherPath);
// watcherPath = AppDomain.CurrentDomain.BaseDirectory;
}
watcher = new FileSystemWatcher();
//初始化监听
watcher.BeginInit();
//设置需要监听的更改类型(如:文件或者文件夹的属性,文件或者文件夹的创建时间;NotifyFilters枚举的内容)
watcher.NotifyFilter = NotifyFilters.Attributes
| NotifyFilters.CreationTime
| NotifyFilters.DirectoryName
| NotifyFilters.FileName
| NotifyFilters.LastAccess
| NotifyFilters.LastWrite
| NotifyFilters.Security
| NotifyFilters.Size;
//设置监听的路径
watcher.Path = watcherPath;
watcher.Changed += new FileSystemEventHandler(Watcher_Changed);
// watcher.Created += Watcher_Created;
watcher.Deleted += new FileSystemEventHandler(Watcher_Deleted);
watcher.Renamed += new RenamedEventHandler(Watcher_Renamed);
watcher.Error += OnError;
//设置监听文件类型
watcher.Filter = fileFilter;
//设置是否监听子目录
watcher.IncludeSubdirectories = true;
//设置是否启用监听
watcher.EnableRaisingEvents = false;
watcher.EndInit();
}
private void OnError(object sender, ErrorEventArgs e)
{
}
private void Watcher_Changed(object sender, FileSystemEventArgs e)
{
Thread.Sleep(100);
// string tmp = dt.Hour.ToString() + "时" + dt.Minute.ToString() + "分" + dt.Second.ToString() + "秒" + dt.Millisecond.ToString() + "毫秒,目录发生变化\r\n";
DateTime lastWriteTime = File.GetLastWriteTime(e.FullPath);
watcher.EnableRaisingEvents = false;
Debug.WriteLine($"最后修改时间:{lastWriteTime}");
string lastLine = File.ReadLines(e.FullPath).Last().Trim();
var msEvent = new MsEventModel(lastLine) { CurrentTime = DateTime.Now };
msEvent.ProjectId = this.ProjectId;
msEvent.ProjectName = this.ProName;
WatcherFileChanged?.Invoke(msEvent, e);
watcher.EnableRaisingEvents = true;
}
private void Watcher_Renamed(object sender, RenamedEventArgs e)
{
DateTime dt = DateTime.Now;
string tmp = dt.Hour.ToString() + "时" + dt.Minute.ToString() + "分" + dt.Second.ToString() + "秒" + dt.Millisecond.ToString() + "毫秒,目录发生变化\r\n";
tmp += "改变类型 :" + e.ChangeType.ToString() + "\r\n"; ;
tmp += "文件全称:" + e.FullPath + "\r\n";
}
private void Watcher_Created(object sender, FileSystemEventArgs e)
{
DateTime dt = DateTime.Now;
string tmp = dt.Hour.ToString() + "时" + dt.Minute.ToString() + "分" + dt.Second.ToString() + "秒" + dt.Millisecond.ToString() + "毫秒,目录发生变化\r\n";
tmp += "改变类型 :" + e.ChangeType.ToString() + "\r\n"; ;
tmp += "文件全称:" + e.FullPath + "\r\n";
}
private void Watcher_Deleted(object sender, FileSystemEventArgs e)
{
DateTime dt = DateTime.Now;
string tmp = dt.Hour.ToString() + "时" + dt.Minute.ToString() + "分" + dt.Second.ToString() + "秒" + dt.Millisecond.ToString() + "毫秒,目录发生变化\r\n";
tmp += "改变类型 :" + e.ChangeType.ToString() + "\r\n"; ;
tmp += "文件全称:" + e.FullPath + "\r\n";
}
/// <summary>
/// 启动或者停止监听
/// </summary>
/// <param name="IsEnableRaising">True:启用监听,False:关闭监听</param>
private void WatchStartOrSopt(bool IsEnableRaising)
{
watcher.EnableRaisingEvents = IsEnableRaising;
}
private FileSystemWatcher watcher = new FileSystemWatcher();
}
}