2010-11-09 73 views
1

背景:禁用Windows XP文件緩存

我有一個從光盤播放視頻文件的應用程序。當我第一次播放這些文件時,文件讀取有時會滯後。但是,第二次播放時沒有任何延遲,我懷疑這是因爲該文件在第一次播放時被放入Windows文件緩存中。

我的應用程序的要求是它應該能夠隨時播放任何視頻(同一個視頻幾乎從不播放兩次,因此無需緩存),這使得目前的問題非常關鍵。

爲了調試這個問題,我需要禁用windows xp文件緩存。

問題

有沒有一種方法來禁用Windows XP文件緩存?

編輯/更多信息

進出口使用的ffmpeg,並有實際的文件沒有訪問讀取調用。即使先前播放過其他幾個文件(預熱),也會出現此問題。

+1

你確定它是winxp文件緩存嗎?也許你可以嘗試使用ProcMon或FileMon(sys內部實用程序的確切名稱來監視文件訪問),以確定IO的實際操作是什麼?另外,你的應用程序如何播放這些文件?如果它正在使用CreateFile/ReadFile/WriteFile等文件IO等,那麼我懷疑操作系統正在做緩存。 – obelix 2010-11-09 12:37:33

+0

我不知道有任何其他緩存可以解釋這種行爲。 – ronag 2010-11-09 13:17:15

+1

藉助Microsoft Detours,您可以訪問實際的文件公開呼叫。它不適合生產工作,但對於這種調試,這是一個快速解決方案。 – MSalters 2010-11-09 13:42:04

回答

3

一般來說,你不能只強制FILE_FLAG_NO_BUFFERING。它需要對齊的緩衝區,並且通常不提供這些緩衝區。此外,這是錯誤的。您不關心Windows是否提前讀取32KB

您希望Windows做的唯一事情就是在讀取它們後從緩存中丟棄文件內容。正確的標誌是FILE_FLAG_SEQUENTIAL_SCAN。這提示Windows(可能)不會回溯,所以沒有理由將這些字節保存在緩存中。

2

您可以嘗試將FILE_FLAG_NO_BUFFERING傳遞給CreateFile()以避免高速緩存。這對你的緩衝區提出了一些要求。具體來說,它們的大小必須是扇區大小的倍數,並且它們的地址必須與扇區大小對齊。有關更多詳細信息,請參閱MSDN

2

假設你有機會獲得最終打開你的文件的CreateFile調用,您可以使用FILE_FLAG_NO_BUFFERING當你打開它:

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

如果你不調用CreateFile自己直接,而是通過某種的圖書館,你需要看看他們是否提供了一種方法讓你間接設置這個標誌。

您可能還會發現,最初的延遲是由於可以組成Windows媒體堆棧的大量DLL的加載而導致的,在這種情況下,更改媒體文件本身的打開方式將無濟於事。

您可以通過製作一個非常簡短的媒體文件來測試這一點,您可以在應用程序啓動時播放這個文件來「預熱」堆棧。