讲师中心 微信公众号
AI工具推荐 视频效率加速

C# 文件系统变化快照 C#如何高效地获取两次扫描之间的文件变化列表

千辰吖_5210

千辰吖_5210

发布时间:2026-02-26 08:40:43

|

363人浏览过

|

来源于php中文网

原创

FileSystemWatcher 实时监听需谨慎:事件顺序不可靠,易漏报或重复;应缓存路径异步批量处理,结合快照对比(路径差集+时间戳/哈希校验)识别增删改与高概率重命名。

c# 文件系统变化快照 c#如何高效地获取两次扫描之间的文件变化列表

用 FileSystemWatcher 实时监听,但别直接信它的事件顺序

它确实能捕获创建、删除、重命名等动作,但实际中常漏报或重复触发——尤其在批量操作(如解压、同步工具写入)时,Changed 事件可能被合并,Rename 可能拆成 Created + Deleted。别把业务逻辑绑死在单个事件上。

  • 务必启用 IncludeSubdirectories = true,否则子目录变更不会上报
  • 设置 NotifyFilter 时,NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName 是最常用组合;加 Attributes 或 Security 会显著拖慢性能
  • 事件回调里不要做耗时操作(如写数据库、发 HTTP 请求),用 ConcurrentQueue<string> 缓存路径,另起线程批量处理
  • Windows 上对 NTFS 卷更稳定,但若监控网络驱动器(如 Z:\),FileSystemWatcher 很容易静默失效,得配合定期快照兜底

手动快照对比:用 GetFileSystemInfos + 哈希跳过内容比对

两次扫描间取差集,核心不是“比文件内容”,而是“快速识别增删改”。直接读全量文件内容算 MD5?太慢。改名和属性变更也得识别出来。

  • 每次快照存一个 Dictionary<string, (long Length, DateTime LastWriteTime, string Hash)>,键是 FullPath
  • Hash 不必是完整内容哈希:对小文件(Length < 1024 * 1024)算 MD5;大文件只取开头 4KB + 结尾 4KB 拼接后哈希,足够区分绝大多数修改
  • 对比时先按路径找增删(字典 key 差集),再对共有的路径比 LastWriteTime 和 Hash —— 时间戳变但哈希没变?大概率只是访问时间更新,可忽略
  • 注意:NTFS 的 LastWriteTime 精度只有 100ns,但 FAT32 是 2s,跨卷对比时别依赖毫秒级时间判断

绕不开的重命名检测:靠 CreationTime 和 LastWriteTime 组合推断

文件系统不记录“原路径”,所以纯靠两次快照无法 100% 确认重命名。但可以高概率识别:同一文件在两次快照中长度一致、哈希一致,但路径不同,且新文件 CreationTime 接近旧文件 LastWriteTime(误差

C#
C#

"避开 C# 常见错误——空陷阱、异步陷阱、LINQ 陷阱及资源泄漏。"

下载
  • 别只看 CreationTime == LastWriteTime,有些备份工具会重置创建时间
  • 如果旧路径文件已消失,新路径文件存在且满足上述条件,记为 RenamedFrom: oldPath
  • 遇到同名文件反复删建(如日志轮转),这种推断会误判,需加白名单路径过滤(如 *.log)
  • Windows 上可通过 GetFileInformationByHandle 调用底层 API 获取文件 ID(FileIndexLow/High),但 .NET 标准库不暴露,得用 System.IO.File.GetAttributes + P/Invoke,权衡维护成本

性能临界点在哪?10 万文件以上必须分块 + 异步扫描

单次调用 Directory.GetFileSystemEntries 扫整个盘?内存暴涨、UI 冻结、还容易被杀毒软件拦截。10 万文件是明显分水岭。

  • 用 Directory.EnumerateFileSystemEntries(返回 IEnumerable<string>),边遍历边处理,不缓存全量路径
  • 按目录层级分块:先扫根下一级所有子目录路径,再用 Parallel.ForEach 分配到线程池,每块限 500 个子目录
  • 对每个子目录,用 new DirectoryInfo(path).GetFileSystemInfos(),并设置 SearchOption.TopDirectoryOnly 避免递归嵌套开销
  • 别在 UI 线程等结果,用 Task.Run 包裹扫描逻辑,完成后通过 Dispatcher.Invoke 或 SynchronizationContext 回 UI 更新进度

真正难的不是代码怎么写,是当用户一边拷贝几十 GB 视频一边点“刷新”时,你怎么让程序既不卡死、又不把临时文件(~$xxx.docx、.part)当成新增文件上报。这些边界情况,得靠日志埋点+真实场景压测才能揪出来。

热门AI工具

更多
立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6579

2023.08.02

php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

778

2025.12.04

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

1867

2023.09.19

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

4318

2023.08.10

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3279

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2838

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

1488

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

2599

2023.08.02

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

20

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn