C++ 禁用Windows XP文件缓存

C++ 禁用Windows XP文件缓存,c++,windows-xp,C++,Windows Xp,背景: 我有一个从光盘播放视频文件的应用程序。当我第一次播放这些文件时,文件读取有时会滞后。但是,第二次播放时,不会有任何延迟,我怀疑这是因为文件在第一次播放时被放入windows文件缓存 我的应用程序的要求是,它应该能够在任何时间播放任何视频(同一视频几乎从未播放过两次,因此不需要缓存),这使得当前的问题非常关键 为了调试这个问题,我需要禁用windows xp文件缓存 问题 有没有办法禁用windows xp文件缓存 编辑/更多信息 Im使用ffmpeg,无法访问实际的文件读取调用。即使之前

背景:

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

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

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

问题

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

编辑/更多信息


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

您可以尝试将
文件\u标志\u无缓冲
传递到
创建文件()
,以避免缓存。这对缓冲区提出了一些要求。具体来说,它们的大小必须是扇区大小的倍数,并且它们的地址必须与扇区大小对齐。有关更多详细信息,请参阅。

您可以尝试将
文件\u标志\u否\u缓冲
传递到
创建文件()
,以避免缓存。这对缓冲区提出了一些要求。具体来说,它们的大小必须是扇区大小的倍数,并且它们的地址必须与扇区大小对齐。有关更多详细信息,请参阅。

假设您有权访问最终打开文件的CreateFile调用,则可以在打开文件时使用file\u FLAG\u NO\u缓冲:

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

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


您可以通过制作一个极短的媒体文件(在应用程序启动时播放)来测试这一点,以“预热”堆栈。

假设您有权访问最终打开文件的CreateFile调用,您可以在打开文件时使用file\u FLAG\u NO\u缓冲:

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

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


你可以通过制作一个极短的媒体文件来测试这一点,你可以在应用程序启动时播放该文件来“预热”堆栈。

一般来说,你不能只强制
文件\u标记\u无\u缓冲。它需要对齐的缓冲区,通常不提供这些缓冲区。此外,这是错误的。你不在乎Windows是否提前读取32KB


您希望Windows做的唯一一件事是在读取文件内容后从缓存中丢弃它们。正确的标志是
FILE\u flag\u SEQUENTIAL\u SCAN
。这会提示Windows您(可能)不会重新查找,因此没有理由将这些字节保留在缓存中。

一般来说,您不能强制执行
文件\u标志\u无缓冲。它需要对齐的缓冲区,通常不提供这些缓冲区。此外,这是错误的。你不在乎Windows是否提前读取32KB


您希望Windows做的唯一一件事是在读取文件内容后从缓存中丢弃它们。正确的标志是
FILE\u flag\u SEQUENTIAL\u SCAN
。这会提示Windows您(可能)不会重新查找,因此没有理由将这些字节保留在缓存中。

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