讲师中心 微信公众号

工具推荐

视频效率加速
updream

一键生成高质量推广成片

Seko
Seko

AI短剧一键生成成片

Laper
Laper

剧本策划到成片协作

AniShort
AniShort

AI短剧协同制作平台

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

小墨小哥_6695

小墨小哥_6695

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

|

428人浏览过

|

来源于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.txt 和 a.txt 被当成两个键
  • 缓存过期时间设为 100–500ms 即可——太长会错过外部进程创建/删除文件的变更;太短起不到作用
  • 不要缓存 Directory.Exists 的结果去推断子文件是否存在,目录存在 ≠ 子项可访问(权限、符号链接断裂、重解析点失效都会导致后续 File.OpenRead 失败)

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

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

常见错误现象:

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

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

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

C#
C#

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

下载

使用场景与要点:

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

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

影响 File.Exists 或 File.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工具

更多
超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

DeepSeek

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

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

WorkBuddy

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

豆包大模型

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

相关专题

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

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

2295

2023.08.07

json是什么
json是什么

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

3722

2023.08.23

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

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

1236

2023.10.13

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

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

4319

2025.09.10

string转int
string转int

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

7299

2023.08.02

scripterror怎么解决
scripterror怎么解决

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

1049

2023.10.18

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

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

3400

2023.10.25

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

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

1898

2023.08.03

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

40

2026.11.06

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
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