禁用 Windows XP 文件缓存

Posted

技术标签:

【中文标题】禁用 Windows XP 文件缓存【英文标题】:Disable Windows XP File Caching 【发布时间】:2010-11-09 12:27:06 【问题描述】:

背景:

我有一个从光盘播放视频文件的应用程序。当我第一次播放这些文件时,文件读取有时会滞后。但是,第二次播放从来没有任何延迟,我怀疑这是因为文件在第一次播放时被放入了 windows 文件缓存。

我的应用程序的要求是它应该能够随时播放任何视频(同一视频几乎从不播放两次,因此不需要缓存),这使得当前的问题非常关键。

为了调试这个问题,我需要禁用 windows xp 文件缓存。

问题

有没有办法禁用 windows xp 文件缓存?

编辑/更多信息

我正在使用 ffmpeg,并且无法访问实际的文件读取调用。即使之前播放了几个其他文件(预热),也可能会出现此问题。

【问题讨论】:

你确定是winxp文件缓存吗?也许您可以尝试 ProcMon 或 FileMon(用于监视文件访问的 sys internals 实用程序的确切名称我不知道)以确保实际执行 IO 的是什么?另外,您的应用程序如何播放文件?如果它正在使用 CreateFile/ReadFile/WriteFile 等进行文件 IO,那么我怀疑操作系统是否正在缓存。 我不知道有任何其他缓存可以解释这种行为。 使用 Microsoft Detours,您可以访问实际的文件打开调用。它不适合生产工作,但对于这种调试,它是一个快速的解决方案。 【参考方案1】:

一般来说,您不能只强制FILE_FLAG_NO_BUFFERING。它需要对齐的缓冲区,通常不提供这些。此外,这是错误的事情。您不在乎 Windows 是否提前读取 32KB

您希望 Windows 做的唯一一件事就是在您读取文件内容后从缓存中丢弃它们。正确的标志是FILE_FLAG_SEQUENTIAL_SCAN。这暗示 Windows 您(可能)不会回溯,因此没有理由将这些字节保留在缓存中。

【讨论】:

【参考方案2】:

您可以尝试将FILE_FLAG_NO_BUFFERING 传递给CreateFile() 以避免缓存。这对您的缓冲区提出了一些要求。具体来说,它们的大小必须是扇区大小的倍数,并且它们的地址必须与扇区大小对齐。详情请见MSDN。

【讨论】:

【参考方案3】:

假设您有权访问最终打开文件的 CreateFile 调用,则可以在打开文件时使用 FILE_FLAG_NO_BUFFERING:

http://msdn.microsoft.com/en-us/library/aa363858%28VS.85%29.aspx

如果您不是自己直接调用 CreateFile,而是通过某种库调用,则需要查看它们是否提供了让您间接设置此标志的方法。

您可能还会发现初始延迟是由加载大量 DLL 引起的,这些 DLL 可以构成 Windows 中的媒体堆栈,在这种情况下,更改媒体文件本身的打开方式将无济于事。

您可以通过制作一个极短的媒体文件(在应用启动时播放该文件)来“预热”堆栈来对此进行测试。

【讨论】:

以上是关于禁用 Windows XP 文件缓存的主要内容,如果未能解决你的问题,请参考以下文章

使用 IXMLHTTPRequest 2 进行流式传输时如何在 Windows 8 上禁用缓存?

为啥即使禁用缓存,服务器也会忽略代码文件中的更改?

C# WebClient 禁用缓存

Auth0 - 禁用用户配置文件缓存

禁用JavaScript文件的nginx缓存

如何禁用ECSHOP缓存,如何关闭ECSHOP缓存