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.

265 lines
9.9 KiB
C#

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<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 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
//});
}
/// <summary>
/// 启动或者停止监听
/// </summary>
/// <param name="IsEnableRaising">True:启用监听,False:关闭监听</param>
private void WatchStartOrSopt(bool IsEnableRaising)
{
watcher.EnableRaisingEvents = IsEnableRaising;
}
private FileSystemWatcher watcher = new FileSystemWatcher();
}
}