You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

325 lines
12 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using DryIoc;
using Prism.Commands;
using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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(WebsocketClient websocketClient )
{
string filter = "*.txt";
string str = File.ReadAllText("systemconfig.json");
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;
public string WatcherPath
{
get { return watcherPath; }
set { SetProperty(ref watcherPath , value); }
}
private ObservableCollection<WatcherFileModel> dataList = new ObservableCollection<WatcherFileModel>();
public ObservableCollection<WatcherFileModel> DataList
{
get { return dataList; }
set { SetProperty(ref dataList , value); }
}
private DateTime startTime;
public DateTime StartTime { get => startTime; set => SetProperty(ref startTime, value); }
private string runTime;
public string RunTime
{
get { return runTime; }
set { SetProperty(ref runTime, value); }
}
private ObservableCollection<int> intervalTimesSource = new ObservableCollection<int>();
public ObservableCollection<int> IntervalTimesSource
{
get { return intervalTimesSource; }
set { intervalTimesSource = value; }
}
private int selectedIndex;
public int SelectedIndex
{
get { return selectedIndex; }
set { SetProperty(ref selectedIndex, value); }
}
private int proMonInterval = 5;
public int ProMonInterval
{
get => proMonInterval;
set => SetProperty(ref proMonInterval, value);
}
private bool isIndeterminate = false;
public bool IsIndeterminate
{
get { return isIndeterminate; }
set { SetProperty(ref isIndeterminate, value); }
}
public void InitializeParams(string fileFilter)
{
timer1.Interval = TimeSpan.FromSeconds(ProMonInterval);
IntervalTimesSource.Add(5);
IntervalTimesSource.Add(10);
IntervalTimesSource.Add(15);
IntervalTimesSource.Add(20);
IntervalTimesSource.Add(30);
IntervalTimesSource.Add(60);
SelectedIndex = 1;
//如果设置的目录不存在设置到根目录
if(!File.Exists(WatcherPath))
{
WatcherPath = AppDomain.CurrentDomain.BaseDirectory;
}
watcher = new FileSystemWatcher(WatcherPath);
//初始化监听
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 += Watcher_Changed;
watcher.Created += Watcher_Created;
watcher.Deleted += Watcher_Deleted;
watcher.Renamed += Watcher_Renamed;
watcher.Error += OnError;
//设置监听文件类型
watcher.Filter =fileFilter;
//设置是否监听子目录
watcher.IncludeSubdirectories = true;
//设置是否启用监听
// watcher.EnableRaisingEvents = false;
watcher.EndInit();
}
public DelegateCommand StartCommand => new(Start);
public DelegateCommand StopCommand => new(Stop);
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.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 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, 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";
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);
}));
}
private void Watcher_Renamed(object sender, RenamedEventArgs 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(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)
{
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_Deleted(object sender, 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(new WatcherFileModel
{
CreateTime= DateTime.Now.ToString(),
ChangeType=e.ChangeType,
Name=e.Name,
FullPath= e.FullPath,
Data=tmp
});
}));
}
/// <summary>
/// 启动或者停止监听
/// </summary>
/// <param name="IsEnableRaising">True:启用监听,False:关闭监听</param>
private void WatchStartOrSopt(bool IsEnableRaising)
{
watcher.EnableRaisingEvents = IsEnableRaising;
}
private FileSystemWatcher watcher = new FileSystemWatcher();
private DispatcherTimer timer1 = new DispatcherTimer();
private SystemConfig systemConfig = new SystemConfig();
private readonly WebsocketClient _websocketClient;
}
}