using Prism.Commands; using Prism.Events; using Prism.Mvvm; using StartServerWPF.Modules.Main; using StartServerWPF.Modules.Main.models; 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 System.Windows; using System.Windows.Threading; namespace StartServerWPF.Modules.Main.ViewModels { internal class FilesWatcherViewModel : BindableBase { public FilesWatcherViewModel(IEventAggregator ea) { string filter = "*.txt"; string str = File.ReadAllText("systemconfig.json"); WatcherPath = AppDomain.CurrentDomain.BaseDirectory; InitializeParams(filter); StartTime = DateTime.Now; } private string watcherPath; public string WatcherPath { get { return watcherPath; } set { SetProperty(ref watcherPath, value); } } private ObservableCollection dataList = new ObservableCollection(); public ObservableCollection DataList { get { return dataList; } set { SetProperty(ref dataList, value); } } private DateTime startTime; public DateTime StartTime { get => startTime; set => SetProperty(ref startTime, value); } private int selectedIndex; public int SelectedIndex { get { return selectedIndex; } set { SetProperty(ref selectedIndex, value); } } public DelegateCommand StartCommand => new(Start); public DelegateCommand StopCommand => new(Stop); private void Start() { WatchStartOrSopt(true); StartTime=DateTime.Now; // _websocketClient.SendMes(JsonSerializer.Serialize(new CSUserSubscribeMessage { type = CSMessage.subscribe })); } private void Stop() { WatchStartOrSopt(false); // _websocketClient.SendMes(JsonSerializer.Serialize(new CSUserSubscribeMessage { type = CSMessage.unsubscribe })); } public DelegateCommand FilePathSaveCommand => new(() => { System.Windows.Forms.FolderBrowserDialog fbd = new System.Windows.Forms.FolderBrowserDialog(); fbd.SelectedPath = WatcherPath; fbd.Description = "请选择文件路径"; fbd.ShowNewFolderButton = true; if (fbd.ShowDialog() == System.Windows.Forms.DialogResult.OK) { if (fbd.SelectedPath != WatcherPath) { WatcherPath = fbd.SelectedPath; // systemConfig.FilePath = WatcherPath; var options = new JsonSerializerOptions { // 整齐打印 WriteIndented = true, //重新编码,解决中文乱码问题 Encoder = JavaScriptEncoder.Create(UnicodeRanges.All) }; // string message = JsonSerializer.Serialize(systemConfig, options); if (File.Exists(settingDataPath)) { // File.WriteAllText(settingDataPath, message); } } } }); private string settingDataPath = "systemconfig.json"; private void InitializeParams(string fileFilter) { SelectedIndex = 1; //如果设置的目录不存在设置到根目录 if (!File.Exists(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 = false; //设置是否启用监听 watcher.EnableRaisingEvents = false; watcher.EndInit(); } private string DateDiff(DateTime DateTime1, DateTime DateTime2) { string dateDiff = null; TimeSpan ts1 = new TimeSpan(DateTime1.Ticks); TimeSpan ts2 = new TimeSpan(DateTime2.Ticks); TimeSpan ts = ts1.Subtract(ts2).Duration(); if (ts.Days > 0) { dateDiff += ts.Days.ToString() + "天"; } if (ts.Hours > 0) { dateDiff += ts.Hours.ToString() + "小时"; } if (ts.Minutes > 0) { dateDiff += ts.Minutes.ToString() + "分钟"; } dateDiff += ts.Seconds.ToString() + "秒"; return dateDiff; } private void OnError(object sender, ErrorEventArgs e) { } private void Watcher_Changed(object sender, System.IO.FileSystemEventArgs e) { // DateTime dt = DateTime.Now; // 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.ReadAllLines(e.FullPath).Last().Trim(); var str= dataList.Where(f => f.Data == lastLine).FirstOrDefault(); if (!string.IsNullOrWhiteSpace(lastLine) && str==null) { System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(() => { DataList.Add(new WatcherFileModel { CreateTime = DateTime.Now.ToString(), ChangeType = e.ChangeType, Name = e.Name, FullPath = e.FullPath, Data = lastLine, IsSend = false }); })); } watcher.EnableRaisingEvents = true; } private void Watcher_Renamed(object sender, RenamedEventArgs e) { System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(() => { 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"; //DataList.Add(new WatcherFileModel //{ // CreateTime = DateTime.Now.ToString(), // ChangeType = e.ChangeType, // Name = e.Name, // FullPath = e.FullPath, // Data = tmp //}); })); } 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"; //DataList.Add(new WatcherFileModel //{ // CreateTime = DateTime.Now.ToString(), // ChangeType = e.ChangeType, // Name = e.Name, // FullPath = e.FullPath, // Data = tmp //}); } 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"; // DataList.Add(new WatcherFileModel //{ // CreateTime= DateTime.Now.ToString(), // ChangeType=e.ChangeType, // Name=e.Name, // FullPath= e.FullPath, // Data=tmp //}); } /// /// 启动或者停止监听 /// /// True:启用监听,False:关闭监听 private void WatchStartOrSopt(bool IsEnableRaising) { watcher.EnableRaisingEvents = IsEnableRaising; } private FileSystemWatcher watcher = new FileSystemWatcher(); } }