|
|
@ -3,7 +3,6 @@ using Prism.Commands;
|
|
|
|
using Prism.Mvvm;
|
|
|
|
using Prism.Mvvm;
|
|
|
|
using System;
|
|
|
|
using System;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.IO;
|
|
|
|
|
|
|
|
using System.Linq;
|
|
|
|
using System.Linq;
|
|
|
|
using System.Text;
|
|
|
|
using System.Text;
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
using System.Threading.Tasks;
|
|
|
@ -11,32 +10,57 @@ using System.Windows.Controls;
|
|
|
|
using System.Windows;
|
|
|
|
using System.Windows;
|
|
|
|
using System.Collections.ObjectModel;
|
|
|
|
using System.Collections.ObjectModel;
|
|
|
|
using System.Windows.Threading;
|
|
|
|
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
|
|
|
|
namespace Txgy.FilesWatcher.ViewModels
|
|
|
|
{
|
|
|
|
{
|
|
|
|
internal class MainViewModel:BindableBase
|
|
|
|
internal class MainViewModel:BindableBase
|
|
|
|
{
|
|
|
|
{
|
|
|
|
public MainViewModel()
|
|
|
|
public MainViewModel(WebsocketClient websocketClient )
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
string filter = "*.txt";
|
|
|
|
WatcherPath = "E:\\mingzf\\txgy\\WatchChanged";
|
|
|
|
string str = File.ReadAllText("systemconfig.json");
|
|
|
|
InitializeParams();
|
|
|
|
systemConfig = JsonSerializer.Deserialize<SystemConfig>(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;
|
|
|
|
private string watcherPath;
|
|
|
|
|
|
|
|
|
|
|
|
public string WatcherPath
|
|
|
|
public string WatcherPath
|
|
|
|
{
|
|
|
|
{
|
|
|
|
get { return watcherPath; }
|
|
|
|
get { return watcherPath; }
|
|
|
|
set { watcherPath = value; }
|
|
|
|
set { SetProperty(ref watcherPath , value); }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
private List<string> dataList=new List<string>();
|
|
|
|
private ObservableCollection<WatcherFileModel> dataList = new ObservableCollection<WatcherFileModel>();
|
|
|
|
|
|
|
|
|
|
|
|
public List<string> DataList
|
|
|
|
public ObservableCollection<WatcherFileModel> DataList
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
get { return dataList; }
|
|
|
|
get { return dataList; }
|
|
|
|
set { dataList = value; }
|
|
|
|
set { SetProperty(ref dataList , value); }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private DateTime startTime;
|
|
|
|
private DateTime startTime;
|
|
|
@ -63,7 +87,7 @@ namespace Txgy.FilesWatcher.ViewModels
|
|
|
|
get { return selectedIndex; }
|
|
|
|
get { return selectedIndex; }
|
|
|
|
set { SetProperty(ref selectedIndex, value); }
|
|
|
|
set { SetProperty(ref selectedIndex, value); }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
private int proMonInterval = 10;
|
|
|
|
private int proMonInterval = 5;
|
|
|
|
public int ProMonInterval
|
|
|
|
public int ProMonInterval
|
|
|
|
{
|
|
|
|
{
|
|
|
|
get => proMonInterval;
|
|
|
|
get => proMonInterval;
|
|
|
@ -76,7 +100,8 @@ namespace Txgy.FilesWatcher.ViewModels
|
|
|
|
get { return isIndeterminate; }
|
|
|
|
get { return isIndeterminate; }
|
|
|
|
set { SetProperty(ref isIndeterminate, value); }
|
|
|
|
set { SetProperty(ref isIndeterminate, value); }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
public void InitializeParams()
|
|
|
|
|
|
|
|
|
|
|
|
public void InitializeParams(string fileFilter)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
timer1.Interval = TimeSpan.FromSeconds(ProMonInterval);
|
|
|
|
timer1.Interval = TimeSpan.FromSeconds(ProMonInterval);
|
|
|
|
IntervalTimesSource.Add(5);
|
|
|
|
IntervalTimesSource.Add(5);
|
|
|
@ -86,7 +111,11 @@ namespace Txgy.FilesWatcher.ViewModels
|
|
|
|
IntervalTimesSource.Add(30);
|
|
|
|
IntervalTimesSource.Add(30);
|
|
|
|
IntervalTimesSource.Add(60);
|
|
|
|
IntervalTimesSource.Add(60);
|
|
|
|
SelectedIndex = 1;
|
|
|
|
SelectedIndex = 1;
|
|
|
|
|
|
|
|
//如果设置的目录不存在设置到根目录
|
|
|
|
|
|
|
|
if(!File.Exists(WatcherPath))
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
WatcherPath = AppDomain.CurrentDomain.BaseDirectory;
|
|
|
|
|
|
|
|
}
|
|
|
|
watcher = new FileSystemWatcher(WatcherPath);
|
|
|
|
watcher = new FileSystemWatcher(WatcherPath);
|
|
|
|
//初始化监听
|
|
|
|
//初始化监听
|
|
|
|
watcher.BeginInit();
|
|
|
|
watcher.BeginInit();
|
|
|
@ -109,11 +138,11 @@ namespace Txgy.FilesWatcher.ViewModels
|
|
|
|
watcher.Error += OnError;
|
|
|
|
watcher.Error += OnError;
|
|
|
|
|
|
|
|
|
|
|
|
//设置监听文件类型
|
|
|
|
//设置监听文件类型
|
|
|
|
// watcher.Filter = "*.txt";
|
|
|
|
watcher.Filter =fileFilter;
|
|
|
|
//设置是否监听子目录
|
|
|
|
//设置是否监听子目录
|
|
|
|
watcher.IncludeSubdirectories = true;
|
|
|
|
watcher.IncludeSubdirectories = true;
|
|
|
|
//设置是否启用监听
|
|
|
|
//设置是否启用监听
|
|
|
|
watcher.EnableRaisingEvents = false;
|
|
|
|
// watcher.EnableRaisingEvents = false;
|
|
|
|
watcher.EndInit();
|
|
|
|
watcher.EndInit();
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -126,42 +155,98 @@ namespace Txgy.FilesWatcher.ViewModels
|
|
|
|
private void Start()
|
|
|
|
private void Start()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
WatchStartOrSopt(true);
|
|
|
|
WatchStartOrSopt(true);
|
|
|
|
|
|
|
|
StartTime=DateTime.Now;
|
|
|
|
|
|
|
|
timer1.Interval = TimeSpan.FromSeconds(ProMonInterval);
|
|
|
|
|
|
|
|
timer1.Start();
|
|
|
|
|
|
|
|
timer1.Tick += timer1_Tick;
|
|
|
|
|
|
|
|
IsIndeterminate = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void Stop()
|
|
|
|
private void Stop()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
WatchStartOrSopt(false);
|
|
|
|
WatchStartOrSopt(false);
|
|
|
|
|
|
|
|
timer1.Stop();
|
|
|
|
|
|
|
|
IsIndeterminate = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public DelegateCommand FilePathSaveCommand => new(() =>
|
|
|
|
public DelegateCommand FilePathSaveCommand => new(() =>
|
|
|
|
{
|
|
|
|
{
|
|
|
|
System.Windows.Forms.FolderBrowserDialog fbd = new System.Windows.Forms.FolderBrowserDialog();
|
|
|
|
System.Windows.Forms.FolderBrowserDialog fbd = new System.Windows.Forms.FolderBrowserDialog();
|
|
|
|
fbd.SelectedPath = WatcherPath;
|
|
|
|
fbd.SelectedPath = WatcherPath;
|
|
|
|
|
|
|
|
fbd.Description = "请选择文件路径";
|
|
|
|
fbd.ShowNewFolderButton = true;
|
|
|
|
fbd.ShowNewFolderButton = true;
|
|
|
|
if (fbd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
|
|
|
|
if (fbd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
// MainModel.DataSavePath = fbd.SelectedPath;
|
|
|
|
if (fbd.SelectedPath != WatcherPath)
|
|
|
|
//if (MainModel.DataSavePath != _systemConfig.vpnInfo.DataSavePath)
|
|
|
|
{
|
|
|
|
//{
|
|
|
|
WatcherPath = fbd.SelectedPath;
|
|
|
|
// updateJson = true;
|
|
|
|
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 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(() => {
|
|
|
|
Application.Current.Dispatcher.BeginInvoke(new Action(() => {
|
|
|
|
|
|
|
|
|
|
|
|
DateTime dt = DateTime.Now;
|
|
|
|
DateTime dt = DateTime.Now;
|
|
|
|
string tmp = dt.Hour.ToString() + "时" + dt.Minute.ToString() + "分" + dt.Second.ToString() + "秒" + dt.Millisecond.ToString() + "毫秒,目录发生变化\r\n";
|
|
|
|
string tmp = dt.Hour.ToString() + "时" + dt.Minute.ToString() + "分" + dt.Second.ToString() + "秒" + dt.Millisecond.ToString() + "毫秒,目录发生变化\r\n";
|
|
|
|
tmp += "改变类型 :" + e.ChangeType.ToString() + "\r\n"; ;
|
|
|
|
string lastLine = File.ReadAllLines(e.FullPath).Last();
|
|
|
|
tmp += "文件全称:" + e.FullPath + "\r\n";
|
|
|
|
DataList.Add(new WatcherFileModel
|
|
|
|
DataList.Add(tmp);
|
|
|
|
{
|
|
|
|
|
|
|
|
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";
|
|
|
|
string tmp = dt.Hour.ToString() + "时" + dt.Minute.ToString() + "分" + dt.Second.ToString() + "秒" + dt.Millisecond.ToString() + "毫秒,目录发生变化\r\n";
|
|
|
|
tmp += "改变类型 :" + e.ChangeType.ToString() + "\r\n"; ;
|
|
|
|
tmp += "改变类型 :" + e.ChangeType.ToString() + "\r\n"; ;
|
|
|
|
tmp += "文件全称:" + e.FullPath + "\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";
|
|
|
|
string tmp = dt.Hour.ToString() + "时" + dt.Minute.ToString() + "分" + dt.Second.ToString() + "秒" + dt.Millisecond.ToString() + "毫秒,目录发生变化\r\n";
|
|
|
|
tmp += "改变类型 :" + e.ChangeType.ToString() + "\r\n"; ;
|
|
|
|
tmp += "改变类型 :" + e.ChangeType.ToString() + "\r\n"; ;
|
|
|
|
tmp += "文件全称:" + e.FullPath + "\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";
|
|
|
|
string tmp = dt.Hour.ToString() + "时" + dt.Minute.ToString() + "分" + dt.Second.ToString() + "秒" + dt.Millisecond.ToString() + "毫秒,目录发生变化\r\n";
|
|
|
|
tmp += "改变类型 :" + e.ChangeType.ToString() + "\r\n"; ;
|
|
|
|
tmp += "改变类型 :" + e.ChangeType.ToString() + "\r\n"; ;
|
|
|
|
tmp += "文件全称:" + e.FullPath + "\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 FileSystemWatcher watcher = new FileSystemWatcher();
|
|
|
|
private DispatcherTimer timer1 = new DispatcherTimer();
|
|
|
|
private DispatcherTimer timer1 = new DispatcherTimer();
|
|
|
|
|
|
|
|
private SystemConfig systemConfig = new SystemConfig();
|
|
|
|
|
|
|
|
private readonly WebsocketClient _websocketClient;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|