0

0

C# 文件系统的IO路径缓存 C#页面缓存(Page Cache)是如何工作的及其对应用的影响

星降

星降

发布时间:2026-02-25 09:45:31

|

368人浏览过

|

来源于php中文网

原创

file.exists无系统缓存,每次调用均触发完整路径解析与元数据访问;建议短时高频场景用concurrentdictionary缓存,键需path.getfullpath规范化,过期设100–500ms。

c# 文件系统的io路径缓存 c#页面缓存(page cache)是如何工作的及其对应用的影响

Windows 文件系统本身不缓存 File.Exists 这类路径查询结果

很多人以为调用 File.Exists 多次,系统会自动记住上次结果,实际不是。NTFS 和 .NET 的 IO 层都不对单个路径存在性做用户态或内核态的“查询缓存”。每次调用都触发一次完整的路径解析 + 元数据访问(哪怕文件就在内存页中),尤其在 UNC 路径、挂载卷或杀毒软件 hook 重定向时延迟明显。

实操建议:

  • 如果同一路径在短时间(比如一个请求周期)内被反复检查,自己加一层 ConcurrentDictionary<string bool></string> 缓存,键用 Path.GetFullPath(path) 规范化,避免 ./a.txta.txt 被当成两个键
  • 缓存过期时间设为 100–500ms 即可——太长会错过外部进程创建/删除文件的变更;太短起不到作用
  • 不要缓存 Directory.Exists 的结果去推断子文件是否存在,目录存在 ≠ 子项可访问(权限、符号链接断裂、重解析点失效都会导致后续 File.OpenRead 失败)

Page.Cache 和文件系统 IO 没有直接关系

ASP.NET 的 Page.Cache(即 HttpContext.Current.CacheMemoryCache)是纯内存对象缓存机制,它不感知、也不干预底层文件读写行为。你往里面存一个 byte[]string,和磁盘上有没有对应文件、路径是否有效完全无关。

常见错误现象:

  • 页面里写了 Page.Cache["config"] = File.ReadAllText("web.config"),但没处理 FileNotFoundException,上线后配置文件名小写拼错,整个页面崩掉
  • 缓存了 FileInfo 对象,以为能免去重复 new FileInfo(path) 开销,其实 FileInfo 构造函数本身不访问磁盘,真正开销在 .Length.Exists
  • Page.Cache 当成文件变更监听器用——文件改了,缓存不会自动失效,必须手动 Remove 或用 CacheDependency

真要实现文件变更自动刷新,得用 FileSystemWatcher 配合缓存失效

FileSystemWatcher 是唯一能低成本响应文件增删改的机制,但它不是“缓存”,只是通知器。它和缓存之间必须手动桥接,否则毫无意义。

PatentPal专利申请写作
PatentPal专利申请写作

AI软件来为专利申请自动生成内容

下载

使用场景与要点:

  • 只监视具体文件(如 appsettings.json),别监视整个 bin/ 目录——事件风暴会导致 CPU 爆高、漏事件、甚至 Watcher 崩溃
  • Changed 事件可能触发多次(例如保存时编辑器先清空再写入),要用 Threading.Timer 去抖动,延迟 100ms 后再执行缓存更新
  • 务必订阅 Error 事件并记录日志:Watcher 在远程 SMB 共享、USB 设备拔出等场景下会静默停止,不报错也不再触发事件
  • 不要在 Changed 回调里直接调用 File.ReadAllText——IO 是阻塞的,会拖慢事件队列,应交由 Task.Run 或后台线程处理

性能差异主要来自路径解析和安全检查,不是“缓存命中率”

影响 File.ExistsFile.Open 性能的关键,从来不是“有没有缓存”,而是三件事:路径字符串规范化开销、ACL 权限逐级检查、以及最终的磁盘/网络 IO 延迟。

参数差异与兼容性注意:

  • Path.GetRelativePath 替代手拼路径字符串,避免 ..\..\ 导致解析失败或越权访问
  • .NET 6+ 支持 File.Exists(string, System.IO.FileAttributes) 重载,可跳过部分属性读取,但仅对 NTFS 有效,Linux/macOS 下退化为普通调用
  • 在容器环境(如 Linux Docker)中,挂载的 Windows 主机路径经 CIFS/Samba 暴露时,File.Exists 可能返回 false 即使文件真实存在——这是协议层限制,加缓存也无解,得换用 Directory.GetFiles 扫描后匹配

最常被忽略的一点:缓存路径查询结果的前提,是你能接受“最多几百毫秒内看不到外部变更”。如果业务逻辑依赖强实时性(比如热插拔配置、多进程协同写日志),那任何用户态缓存都是危险的,不如老老实实每次查,再配好超时和重试。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

智谱清言 - 免费全能的AI助手
智谱清言 - 免费全能的AI助手

智谱清言 - 免费全能的AI助手

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

448

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

544

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

323

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

81

2025.09.10

string转int
string转int

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

850

2023.08.02

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

391

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

348

2023.10.25

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

638

2023.08.03

Golang 生态工具与框架:扩展开发能力
Golang 生态工具与框架:扩展开发能力

《Golang 生态工具与框架》系统梳理 Go 语言在实际工程中的主流工具链与框架选型思路,涵盖 Web 框架、RPC 通信、依赖管理、测试工具、代码生成与项目结构设计等内容。通过真实项目场景解析不同工具的适用边界与组合方式,帮助开发者构建高效、可维护的 Go 工程体系,并提升团队协作与交付效率。

18

2026.02.24

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10.2万人学习

C 教程
C 教程

共75课时 | 4.9万人学习

C++教程
C++教程

共115课时 | 19.3万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号