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 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"; } /// /// 启动或者停止监听 /// /// True:启用监听,False:关闭监听 private void WatchStartOrSopt(bool IsEnableRaising) { watcher.EnableRaisingEvents = IsEnableRaising; } private FileSystemWatcher watcher = new FileSystemWatcher(); } }