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; } }