Skip to content

扫描逻辑

本文描述了 Xdows Security 扫描页面的扫描逻辑(此文档面向开发人员)

功能定位

提供「快速 / 全盘 / 文件 / 文件夹」四种病毒扫描模式,支持多引擎并行异步流式 UI 更新

输入输出
扫描模式 + 用户路径 + 引擎开关实时进度、威胁列表、统计信息、日志文件

时序概览

引擎优先级

ts
// 伪代码,仅表达顺序
async function scanFile(path: string): Promise<string | null> {
  if (useSouXiao)        return await souXiaoScan(path);
  if (useLocal)          return await localScan(path, deep, extra);
  if (useJiSuSafeAXMode) return await AXScan(path);
  if (useCloud)          return await cloudScan(path);
  if (useCzkCloud)       return await czkCloudScan(path, apiKey);
  return null;                                       // 安全
}

枚举策略

模式范围关键实现
Quick系统关键目录 + 可执行扩展名EnumerateQuickScanFiles()
Full所有本地磁盘SafeEnumerateFiles() 跳过无权限节点
File单文件PickSingleFileAsync()
Folder递归目录SafeEnumerateFolder() 栈 + try-catch

状态机

状态触发动作UI 表现
Idle初始 / 扫描结束按钮可用,雷达停止
RunningStartScanAsync按钮禁用,雷达转动
PausedOnPauseScanClick雷达暂停,出现继续按钮
Canceledtoken.Cancel()提示“扫描已取消”

异常与取消

csharp
catch (OperationCanceledException)
{
    StatusText.Text = "扫描已取消";
}
catch (Exception ex)
{
    LogText.AddNewLog(4, "Security - Failed", ex.Message);
}

笔记

所有异常仅影响当前文件,不会中断整个队列。

性能与线程

策略
并发度每文件 Task.Run(...) 不等待,循环延迟 1 ms
UI 刷新DispatcherQueue.TryEnqueue 保证线程安全
I/O 阻塞使用 SafeEnumerate* 提前捕获权限异常

日志格式

级别模块事件详情
1Security - StartScanUse LocalScan-DeepScan CloudScan
1Security - ScanFileC:\Windows\notepad.exe
1Security - FindMEMZUAC.Cloud.VirusFile

FAQ

如何新增扫描引擎?
  1. 在设置中注册开关。
  2. StartScanAsync 读取开关。
  3. 在引擎调用链追加 if (useNewEngine) result = await NewScanAsync(path);
  4. 更新本文档「引擎优先级」段落。
为什么扫描大量文件时 UI 不卡?

所有耗时代码运行在 ThreadPool,UI 更新通过 DispatcherQueue 异步投递。

需要增量扫描?

可缓存 LastScanTime 与文件 LastWriteTime 进行比对,在枚举阶段过滤。