using System;
using System.Collections.Generic;
using System.IO;
using System.Text.Json.Serialization;
namespace JiShe.CollectBus.PluginFileWatcher
{
///
/// 表示一个文件系统事件的数据模型,用于序列化和存储
///
public class FileEvent
{
///
/// 事件唯一标识
///
public Guid Id { get; set; } = Guid.NewGuid();
///
/// 事件发生时间
///
public DateTime Timestamp { get; set; } = DateTime.UtcNow;
///
/// 事件类型
///
public FileEventType EventType { get; set; }
///
/// 文件完整路径
///
public string FullPath { get; set; }
///
/// 文件名
///
public string FileName { get; set; }
///
/// 文件所在目录
///
public string Directory { get; set; }
///
/// 文件扩展名
///
public string Extension { get; set; }
///
/// 重命名前的旧文件名(仅在重命名事件中有效)
///
public string OldFileName { get; set; }
///
/// 重命名前的旧路径(仅在重命名事件中有效)
///
public string OldFullPath { get; set; }
///
/// 文件大小(字节),如果可获取
///
public long? FileSize { get; set; }
///
/// 自定义属性,可用于存储其他元数据
///
public Dictionary Metadata { get; set; } = new Dictionary();
///
/// 从FileSystemEventArgs创建FileEvent
///
/// FileSystemEventArgs参数
/// FileEvent对象
public static FileEvent FromFileSystemEventArgs(FileSystemEventArgs e)
{
var fileEvent = new FileEvent
{
EventType = GetEventType(e.ChangeType),
FullPath = e.FullPath,
FileName = e.Name ?? Path.GetFileName(e.FullPath),
Directory = Path.GetDirectoryName(e.FullPath),
Extension = Path.GetExtension(e.FullPath)
};
// 如果是重命名事件,添加旧文件名信息
if (e is RenamedEventArgs renamedEvent)
{
fileEvent.OldFileName = Path.GetFileName(renamedEvent.OldFullPath);
fileEvent.OldFullPath = renamedEvent.OldFullPath;
}
// 尝试获取文件大小(如果文件存在且可访问)
try
{
if (File.Exists(e.FullPath) && e.ChangeType != WatcherChangeTypes.Deleted)
{
var fileInfo = new FileInfo(e.FullPath);
fileEvent.FileSize = fileInfo.Length;
// 添加一些额外的元数据
fileEvent.Metadata["CreationTime"] = fileInfo.CreationTime.ToString("o");
fileEvent.Metadata["LastWriteTime"] = fileInfo.LastWriteTime.ToString("o");
fileEvent.Metadata["IsReadOnly"] = fileInfo.IsReadOnly.ToString();
}
}
catch
{
// 忽略任何获取文件信息时的错误
}
return fileEvent;
}
///
/// 将WatcherChangeTypes转换为FileEventType
///
/// WatcherChangeTypes枚举值
/// 对应的FileEventType
public static FileEventType GetEventType(WatcherChangeTypes changeType)
{
return changeType switch
{
WatcherChangeTypes.Created => FileEventType.Created,
WatcherChangeTypes.Deleted => FileEventType.Deleted,
WatcherChangeTypes.Changed => FileEventType.Modified,
WatcherChangeTypes.Renamed => FileEventType.Renamed,
_ => FileEventType.Other
};
}
}
///
/// 文件事件类型
///
public enum FileEventType
{
///
/// 文件被创建
///
Created,
///
/// 文件被修改
///
Modified,
///
/// 文件被删除
///
Deleted,
///
/// 文件被重命名
///
Renamed,
///
/// 其他类型事件
///
Other
}
///
/// 表示一个事件日志文件
///
public class EventLogFile
{
///
/// 日志文件创建时间
///
public DateTime CreatedTime { get; set; } = DateTime.UtcNow;
///
/// 日志文件包含的事件列表
///
public List Events { get; set; } = new List();
}
///
/// 事件查询结果
///
public class EventQueryResult
{
///
/// 查询到的事件列表
///
public List Events { get; set; } = new List();
///
/// 匹配的事件总数
///
public int TotalCount { get; set; }
///
/// 查询是否有更多结果
///
public bool HasMore { get; set; }
///
/// 查询时间范围的开始时间
///
public DateTime StartTime { get; set; }
///
/// 查询时间范围的结束时间
///
public DateTime EndTime { get; set; }
}
///
/// 事件查询参数
///
public class EventQueryParams
{
///
/// 查询开始时间
///
public DateTime? StartTime { get; set; }
///
/// 查询结束时间
///
public DateTime? EndTime { get; set; }
///
/// 事件类型过滤
///
public FileEventType? EventType { get; set; }
///
/// 文件路径过滤(支持包含关系)
///
public string PathFilter { get; set; }
///
/// 文件扩展名过滤
///
public string ExtensionFilter { get; set; }
///
/// 分页大小
///
public int PageSize { get; set; } = 100;
///
/// 分页索引(从0开始)
///
public int PageIndex { get; set; } = 0;
///
/// 排序方向,true为升序,false为降序
///
public bool AscendingOrder { get; set; } = false;
}
}