禁用Windows XP文件缓存

时间:2010-11-09 12:27:06

标签: c++ windows-xp

背景

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

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

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

问题

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

编辑/更多信息

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

3 个答案:

答案 0 :(得分:3)

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

您希望Windows执行的唯一操作是在阅读完文件后从缓存中丢弃文件内容。正确的标志是FILE_FLAG_SEQUENTIAL_SCAN。这暗示了您(可能)不会回头的Windows,因此没有理由将这些字节保留在缓存中。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

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

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

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

你可以通过在app启动时制作一个非常短的媒体文件来测试这个,以“预热”堆栈。