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 @@
-
+
@@ -65,36 +66,62 @@
-
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Txgy.FilesWatcher/Views/MainWindow.xaml b/Txgy.FilesWatcher/Views/MainWindow.xaml
index 3d46c63..321ce09 100644
--- a/Txgy.FilesWatcher/Views/MainWindow.xaml
+++ b/Txgy.FilesWatcher/Views/MainWindow.xaml
@@ -3,7 +3,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"
- Title="{Binding Title}" Height="500" Width="800" >
+ Title="{Binding Title}" Height="500" Width="960" >
diff --git a/Txgy.FilesWatcher/WebsocketClient.cs b/Txgy.FilesWatcher/WebsocketClient.cs
index a96cedc..1406620 100644
--- a/Txgy.FilesWatcher/WebsocketClient.cs
+++ b/Txgy.FilesWatcher/WebsocketClient.cs
@@ -13,35 +13,42 @@ namespace Txgy.FilesWatcher
public class WebsocketClient
{
public WebSocket webSocket4Net = null;
- public void WebSocketInit()
+
+ public Action WebsocketError;
+ public Action WebSocketMessageReceived;
+ public void WebSocketInit(string url)
{
- Console.WriteLine("客户端");
- webSocket4Net = new WebSocket("ws://localhost:5000/ws");
+ Debug.WriteLine("客户端");
+ webSocket4Net = new WebSocket(url);
webSocket4Net.Opened += WebSocket4Net_Opened;
webSocket4Net.Error += new EventHandler(WebSocket_Error);
webSocket4Net.MessageReceived += WebSocket4Net_MessageReceived;
webSocket4Net.Open();
- Console.WriteLine("客户端连接成功!");
- Thread thread = new Thread(ClientSendMsgToServer);
+ Debug.WriteLine("客户端连接成功!");
+ Thread thread = new Thread(SendHeartbeat);
thread.IsBackground = true;
thread.Start();
- // webSocket4Net.Dispose();
}
- public void ClientSendMsgToServer()
+ public void SendMes(string message)
+ {
+ webSocket4Net.Send(message);
+ }
+
+ private void SendHeartbeat()
{
int i = 88;
while (true)
{
//Console.WriteLine($"客户端发送数据{i++}");
- Thread.Sleep(TimeSpan.FromSeconds(2));
+ Thread.Sleep(TimeSpan.FromSeconds(1));
if (webSocket4Net.State == WebSocketState.Open)
{
webSocket4Net.Send("{\"type\":\"heartbeat\",\"utype\":\"device\",\"uid\":123}");
}
else if (webSocket4Net.State == WebSocketState.Closed)
{
- Thread.Sleep(TimeSpan.FromSeconds(5));
+ Thread.Sleep(TimeSpan.FromSeconds(10));
webSocket4Net.Open();
}
}
@@ -49,15 +56,17 @@ namespace Txgy.FilesWatcher
private void WebSocket4Net_MessageReceived(object sender, MessageReceivedEventArgs e)
{
+ WebSocketMessageReceived?.Invoke(e.Message);
Debug.WriteLine($"服务端回复数据:{e.Message}!");
}
private void WebSocket4Net_Opened(object sender, EventArgs e)
{
- // webSocket4Net.Send($"客户端准备发送数据!");
+
}
void WebSocket_Error(object sender, ErrorEventArgs e)
{
+ WebsocketError?.Invoke(e);
Debug.WriteLine("websocket_Error:" + e.Exception.ToString());
}
}
diff --git a/Txgy.FilesWatcher/model/SystemConfig.cs b/Txgy.FilesWatcher/model/SystemConfig.cs
new file mode 100644
index 0000000..68a8ebe
--- /dev/null
+++ b/Txgy.FilesWatcher/model/SystemConfig.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Txgy.FilesWatcher.model
+{
+ public class SystemConfig
+ {
+ public string FilePath { get; set; }
+
+ public string Url { get; set; }
+ }
+}
diff --git a/Txgy.FilesWatcher/model/WatcherFileModel.cs b/Txgy.FilesWatcher/model/WatcherFileModel.cs
new file mode 100644
index 0000000..65221e8
--- /dev/null
+++ b/Txgy.FilesWatcher/model/WatcherFileModel.cs
@@ -0,0 +1,40 @@
+using Prism.Mvvm;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Txgy.FilesWatcher.model
+{
+ public class WatcherFileModel : BindableBase
+ {
+
+ private string createTime;
+ private WatcherChangeTypes changeType;
+ private string fullPath;
+ private string name;
+ private string data;
+
+ public string CreateTime
+ {
+ get { return createTime; }
+ set { SetProperty(ref createTime, value); }
+ }
+ public WatcherChangeTypes ChangeType { get => changeType; set => SetProperty(ref changeType, value); }
+
+ public string FullPath { get => fullPath; set => SetProperty(ref fullPath, value); }
+
+ public string Name { get => name; set => SetProperty(ref name, value); }
+
+ public string Data { get => data; set => SetProperty(ref data, value); }
+
+ private bool isSend;
+ public bool IsSend
+ {
+ get { return isSend; }
+ set { SetProperty(ref isSend, value); }
+ }
+ }
+}
diff --git a/Txgy.FilesWatcher/systemconfig.json b/Txgy.FilesWatcher/systemconfig.json
new file mode 100644
index 0000000..62d6c87
--- /dev/null
+++ b/Txgy.FilesWatcher/systemconfig.json
@@ -0,0 +1,4 @@
+{
+ "Url": "ws://localhost:5000/ws",
+ "FilePath": "F:\\SourceTest\\Txgy.FilesWatcher"
+}