Принудительно читать файл/сектор съемного носителя, чтобы возвращать свежие данные (не кэшированные из предыдущего чтения) в Python?

Я построил USB-накопитель данных, который отображается как запоминающее устройство USB при подключении для загрузки файла. Файлы записываются в автономном режиме, но флешка может возвращать ограниченные «живые» данные (часы устройства, заряд батареи, мгновенное значение датчика) при чтении небольшого (‹512 байт, 1 сектор диска) специального файла на устройстве — в основном, как Файл устройства UNIX.

Приложение, которое считывает и использует/отображает данные регистратора, написано на Python.

Я думал, что я умный парень, пока не начал читать живые данные из этого файла. Оказывается, под Windows (проверено пока в XP и Win7) только первое чтение из приложения фактически читает с устройства - попытка повторного чтения файла (сектора) возвращает устаревшие кэшированные данные из начального чтения, даже 10 + минут после первоначального чтения, даже если файл закрывается и снова открывается, или если сектор записывается, а затем повторно читается. Доступ к данным файла через mmap() также не приводит к новым чтениям. Последующие запросы на чтение просто не доходят до устройства. Я предполагаю, что Windows «знает», что она не изменяла сам файл, поэтому содержимое файла не могло быть изменено.

Есть ли какой-либо разумный способ заставить последующее чтение (предпочтительно через «стандартный» вызов ввода-вывода файла Python) фактически возвращать новое чтение с устройства, а не кэшированные данные?

Чтобы было ясно, я конкретно имею в виду блокировку кеша READ, а не синхронизацию содержимого диска после записи.

Существует ли что-нибудь подобное, доступное из Python?


person Drmn    schedule 01.08.2012    source источник


Ответы (1)


Недействительный кэш чтения диска ОС

Использование расширений win32 для Python должно позволить вам напрямую обращаться к вызову CreateFile для открытия файла. Вы можете использовать это для чтения вашего файла.

Вот расширения Win32.

person Max    schedule 01.08.2012
comment
Макс, спасибо! Это именно то, что я искал, и прекрасно работает. Для всех, кто заинтересован, вот простой тест/пример, который я написал, чтобы проверить эту работу: - person Drmn; 09.08.2012
comment
Извинения за форматирование; видимо а) существует жесткое ограничение на количество символов (не подходит для переносов строк), б) посты нельзя редактировать через 5 минут.... - person Drmn; 09.08.2012