diff --git a/Txgy.FilesWatcher/Txgy.FilesWatcher.csproj b/Txgy.FilesWatcher/Txgy.FilesWatcher.csproj index 7f589b7..2f31402 100644 --- a/Txgy.FilesWatcher/Txgy.FilesWatcher.csproj +++ b/Txgy.FilesWatcher/Txgy.FilesWatcher.csproj @@ -10,4 +10,9 @@ + + + PreserveNewest + + \ No newline at end of file diff --git a/Txgy.FilesWatcher/ViewModels/MainViewModel.cs b/Txgy.FilesWatcher/ViewModels/MainViewModel.cs index 3ec039b..4c60486 100644 --- a/Txgy.FilesWatcher/ViewModels/MainViewModel.cs +++ b/Txgy.FilesWatcher/ViewModels/MainViewModel.cs @@ -3,7 +3,6 @@ using Prism.Commands; using Prism.Mvvm; using System; using System.Collections.Generic; -using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -11,32 +10,57 @@ using System.Windows.Controls; using System.Windows; using System.Collections.ObjectModel; using System.Windows.Threading; +using Txgy.FilesWatcher.model; +using System.Text.Json.Serialization; +using System.Text.Json; +using System.Net.NetworkInformation; +using System.Threading; +using System.Net.WebSockets; +using System.Diagnostics; +using WebSocket4Net; +using System.IO; +using System.Text.Encodings.Web; +using System.Text.Unicode; namespace Txgy.FilesWatcher.ViewModels { internal class MainViewModel:BindableBase { - public MainViewModel() + public MainViewModel(WebsocketClient websocketClient ) { - - WatcherPath = "E:\\mingzf\\txgy\\WatchChanged"; - InitializeParams(); + string filter = "*.txt"; + string str = File.ReadAllText("systemconfig.json"); + systemConfig = JsonSerializer.Deserialize(str); + WatcherPath = systemConfig.FilePath; + InitializeParams(filter); + StartTime = DateTime.Now; + this._websocketClient = websocketClient; + _websocketClient.WebsocketError = WebSocket_Error; + _websocketClient.WebSocketMessageReceived = WebSocket4Net_MessageReceived; + _websocketClient.WebSocketInit(systemConfig.Url); + } + private void WebSocket4Net_MessageReceived(string message) + { + Debug.WriteLine($"服务端回复数据:{message}!"); + } + void WebSocket_Error(SuperSocket.ClientEngine.ErrorEventArgs e) + { + Debug.WriteLine("websocket_Error:" + e.Exception.ToString()); } - private string watcherPath; public string WatcherPath { get { return watcherPath; } - set { watcherPath = value; } + set { SetProperty(ref watcherPath , value); } } - private List dataList=new List(); + private ObservableCollection dataList = new ObservableCollection(); - public List DataList + public ObservableCollection DataList { get { return dataList; } - set { dataList = value; } + set { SetProperty(ref dataList , value); } } private DateTime startTime; @@ -63,7 +87,7 @@ namespace Txgy.FilesWatcher.ViewModels get { return selectedIndex; } set { SetProperty(ref selectedIndex, value); } } - private int proMonInterval = 10; + private int proMonInterval = 5; public int ProMonInterval { get => proMonInterval; @@ -76,7 +100,8 @@ namespace Txgy.FilesWatcher.ViewModels get { return isIndeterminate; } set { SetProperty(ref isIndeterminate, value); } } - public void InitializeParams() + + public void InitializeParams(string fileFilter) { timer1.Interval = TimeSpan.FromSeconds(ProMonInterval); IntervalTimesSource.Add(5); @@ -86,7 +111,11 @@ namespace Txgy.FilesWatcher.ViewModels IntervalTimesSource.Add(30); IntervalTimesSource.Add(60); SelectedIndex = 1; - + //如果设置的目录不存在设置到根目录 + if(!File.Exists(WatcherPath)) + { + WatcherPath = AppDomain.CurrentDomain.BaseDirectory; + } watcher = new FileSystemWatcher(WatcherPath); //初始化监听 watcher.BeginInit(); @@ -109,11 +138,11 @@ namespace Txgy.FilesWatcher.ViewModels watcher.Error += OnError; //设置监听文件类型 - // watcher.Filter = "*.txt"; + watcher.Filter =fileFilter; //设置是否监听子目录 watcher.IncludeSubdirectories = true; //设置是否启用监听 - watcher.EnableRaisingEvents = false; + // watcher.EnableRaisingEvents = false; watcher.EndInit(); } @@ -126,42 +155,98 @@ namespace Txgy.FilesWatcher.ViewModels private void Start() { WatchStartOrSopt(true); + StartTime=DateTime.Now; + timer1.Interval = TimeSpan.FromSeconds(ProMonInterval); + timer1.Start(); + timer1.Tick += timer1_Tick; + IsIndeterminate = true; } private void Stop() { WatchStartOrSopt(false); + timer1.Stop(); + IsIndeterminate = false; } public DelegateCommand FilePathSaveCommand => new(() => { System.Windows.Forms.FolderBrowserDialog fbd = new System.Windows.Forms.FolderBrowserDialog(); fbd.SelectedPath = WatcherPath; - fbd.ShowNewFolderButton = true; + fbd.Description = "请选择文件路径"; + fbd.ShowNewFolderButton = true; if (fbd.ShowDialog() == System.Windows.Forms.DialogResult.OK) { - // MainModel.DataSavePath = fbd.SelectedPath; - //if (MainModel.DataSavePath != _systemConfig.vpnInfo.DataSavePath) - //{ - // updateJson = true; - //} + 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 timer1_Tick(object? sender, EventArgs e) + { + RunTime = DateDiff(DateTime.Now, StartTime); + } + + 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, FileSystemEventArgs e) + private void Watcher_Changed(object sender, System.IO.FileSystemEventArgs e) { 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(tmp); + string lastLine = File.ReadAllLines(e.FullPath).Last(); + DataList.Add(new WatcherFileModel + { + CreateTime = DateTime.Now.ToString(), + ChangeType = e.ChangeType, + Name = e.Name, + FullPath = e.FullPath, + Data = lastLine, + IsSend = false + }) ; + _websocketClient.SendMes(lastLine); })); } @@ -173,7 +258,14 @@ namespace Txgy.FilesWatcher.ViewModels 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(tmp); + DataList.Add(new WatcherFileModel + { + CreateTime = DateTime.Now.ToString(), + ChangeType = e.ChangeType, + Name = e.Name, + FullPath = e.FullPath, + Data = tmp + }); })); } @@ -185,7 +277,14 @@ namespace Txgy.FilesWatcher.ViewModels 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(tmp); + DataList.Add(new WatcherFileModel + { + CreateTime = DateTime.Now.ToString(), + ChangeType = e.ChangeType, + Name = e.Name, + FullPath = e.FullPath, + Data = tmp + }); })); } @@ -197,7 +296,14 @@ namespace Txgy.FilesWatcher.ViewModels 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(tmp); + DataList.Add(new WatcherFileModel + { + CreateTime= DateTime.Now.ToString(), + ChangeType=e.ChangeType, + Name=e.Name, + FullPath= e.FullPath, + Data=tmp + }); })); } @@ -212,5 +318,7 @@ namespace Txgy.FilesWatcher.ViewModels private FileSystemWatcher watcher = new FileSystemWatcher(); private DispatcherTimer timer1 = new DispatcherTimer(); + private SystemConfig systemConfig = new SystemConfig(); + private readonly WebsocketClient _websocketClient; } } diff --git a/Txgy.FilesWatcher/Views/MainView.xaml b/Txgy.FilesWatcher/Views/MainView.xaml index 2a54a51..c935d69 100644 --- a/Txgy.FilesWatcher/Views/MainView.xaml +++ b/Txgy.FilesWatcher/Views/MainView.xaml @@ -5,6 +5,7 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:Txgy.FilesWatcher.Views" xmlns:i="http://schemas.microsoft.com/xaml/behaviors" + xmlns:hc="https://handyorg.github.io/handycontrol" mc:Ignorable="d" xmlns:prism="http://prismlibrary.com/" prism:ViewModelLocator.AutoWireViewModel="True" @@ -50,7 +51,7 @@ - +