2010-11-09 6 views
1

фона:Отключить Windows XP Кэширование файлов

У меня есть приложение, которое воспроизводит видео файлы с диска. Когда я воспроизвожу эти файлы, первый раз, когда чтение файла иногда отстает. Тем не менее, во второй раз, когда он воспроизводится, никогда не происходит никакого запаздывания, я подозреваю, что это связано с тем, что файл помещается в кеш-файл Windows при первом воспроизведении.

Требованиями моего приложения является то, что он должен иметь возможность воспроизводить любое видео в любое время (одно и то же видео почти никогда не воспроизводится дважды, что делает ненужным кеш), что делает текущую проблему весьма критичной.

Чтобы отладить эту проблему, мне нужно было бы отключить кеширование файлов Windows XP.

Вопрос

Есть ли способ отключить Windows Xp кэширования файлов?

EDIT/Подробнее

Im использованием FFmpeg, и не имеют доступа к реальному файлу читать вызовы. Проблема может возникнуть, даже если ранее было воспроизведено несколько других файлов (разминка).

+1

Вы уверены, что это кеширование файлов winxp? Возможно, вы могли бы попробовать ProcMon или FileMon (точное имя встроенной утилиты sys для контроля доступа к файлам ускользает от меня), чтобы убедиться, что на самом деле выполняется IO? Кроме того, как приложение работает в файлах? Если он выполняет File IO с помощью CreateFile/ReadFile/WriteFile и т. Д., То я сомневаюсь, что ОС выполняет кеширование. – obelix

+0

Я не знаю другого кэширования, которое могло бы объяснить поведение. – ronag

+1

С Microsoft Detours у вас есть доступ к фактическим открытию открытых файлов. Это не подходит для производственных работ, но для такого рода отладки это быстрое решение. – MSalters

ответ

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 непосредственно сам, а через какое-то библиотеки, вам нужно будет убедиться, что они предоставляют вам возможность косвенно установить этот флаг.

Вы также можете обнаружить, что первоначальная задержка вызвана загрузкой огромного количества DLL, которые могут составлять стек медиа в Windows, и в этом случае изменение способа открытия самого медиафайла не поможет ,

Вы можете проверить это, сделав крайне короткий медиафайл, который вы играете при запуске приложения, для «разминки» стека.

Смежные вопросы