Отключить кэширование диска
От: Аноним  
Дата: 01.02.06 05:01
Оценка:
Доброго времени суток.
Помогите решить проблему. Я записываю некие данные на диск, после чего мне необходимо проверить "качество записи"(посчитать контрольную сумму и т.д).
Проблем азаключается в том что Windows автоматически кэширует данные и при проверке не пытается считать их с диска. Подскажить как запретить Windows пользоваться кэшем(может можно его очистить после записи?).
Спасибо за внимание.
Re: Отключить кэширование диска
От: ekamaloff Великобритания  
Дата: 01.02.06 05:05
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Доброго времени суток.

А>Помогите решить проблему. Я записываю некие данные на диск, после чего мне необходимо проверить "качество записи"(посчитать контрольную сумму и т.д).
А>Проблем азаключается в том что Windows автоматически кэширует данные и при проверке не пытается считать их с диска. Подскажить как запретить Windows пользоваться кэшем(может можно его очистить после записи?).
А>Спасибо за внимание.

FILE_FLAG_NO_BUFFERING?

FlushFileBuffers?
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[2]: Отключить кэширование диска
От: Аноним  
Дата: 01.02.06 06:07
Оценка:
Здравствуйте, ekamaloff, Вы писали:

Спасибо за быстрый ответ, но к сожаленью не помогло.

E>FILE_FLAG_NO_BUFFERING?

Проблема в том что я пользуюсь функциями fopen/fscanf...(программа переделана из DOS для Windows), а если использовать CreateFile и т.д. придется отказаться от использования парсинга с помощью fscanf, и вообще переписывать всю программу.

E>FlushFileBuffers?

На счет этой функции: я так понял, что она очищает "буфер передатчика",т.е. с ее помощью можно заставить систему записать все прокэшированные данные на диск(чтобы можно было его извлеч например).
Провел эксперимент:

//Производим запись на диск
...

HANDLE driveh;
driveh=CreateFile("\\.\a:",
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL/*FILE_FLAG_NO_BUFFERING*/,
NULL);
FlushFileBuffers(driveh); //Сбрасываем кэш

//Считываем данные с диска
...

В результате при считывании Обращения к диску не происходит.
Может есть еще варианты?
Re[3]: Отключить кэширование диска
От: ekamaloff Великобритания  
Дата: 01.02.06 06:13
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:

А>Проблема в том что я пользуюсь функциями fopen/fscanf...(программа переделана из DOS для Windows), а если использовать CreateFile и т.д. придется отказаться от использования парсинга с помощью fscanf, и вообще переписывать всю программу.


Может тогда fflush?
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[4]: Отключить кэширование диска(опять не помогло)
От: uncleslava  
Дата: 01.02.06 07:37
Оценка:
Здравствуйте, ekamaloff, Вы писали:

E>Может тогда fflush?

К сожаленью тоже не подходит.
fflush аналогична FlushFileBuffers(для справки: flush — сбрасывать на диск, взято из Lingvo)
Эти функции сбрасывают кэш при записи на диск.
А нужно произвести чтение с диска игнорируя кэш.
В принципе для этого подходит CreateFile с параметром FILE_FLAG_NO_BUFFERING, видимо придется переделывать программу.
Re[5]: Отключить кэширование диска(опять не помогло)
От: pavel_turbin  
Дата: 01.02.06 09:00
Оценка:
Здравствуйте, uncleslava, Вы писали:

U>Здравствуйте, ekamaloff, Вы писали:


E>>Может тогда fflush?

U>К сожаленью тоже не подходит.
U>fflush аналогична FlushFileBuffers(для справки: flush — сбрасывать на диск, взято из Lingvo)
U>Эти функции сбрасывают кэш при записи на диск.
U>А нужно произвести чтение с диска игнорируя кэш.
U>В принципе для этого подходит CreateFile с параметром FILE_FLAG_NO_BUFFERING, видимо придется переделывать программу.

можешь переписать fopen. Например, найти код fopen в CRT и включить его в свою программу. Потом добавить флаг FILE_FLAG_NO_BUFFERING.
Re[6]: Отключить кэширование диска(опять не помогло)
От: vvotan Россия  
Дата: 04.02.06 20:55
Оценка:
Здравствуйте, pavel_turbin, Вы писали:


_>можешь переписать fopen. Например, найти код fopen в CRT и включить его в свою программу. Потом добавить флаг FILE_FLAG_NO_BUFFERING.

Так просто не выйдет. При записи в файл с FILE_FLAG_NO_BUFFERING требуется соблюдать кучу условий (см. MSDN), которые программа с fopen явно не соблюдает.
И вообще, я бы обратил внимание еще на флаг FILE_FLAG_WRITE_THROUGH.
--
Sergey Chadov

... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Отключить кэширование диска
От: Andrew S Россия http://alchemy-lab.com
Дата: 05.02.06 23:51
Оценка:
А>Спасибо за быстрый ответ, но к сожаленью не помогло.

E>>FILE_FLAG_NO_BUFFERING?

А>Проблема в том что я пользуюсь функциями fopen/fscanf...(программа переделана из DOS для Windows), а если использовать CreateFile и т.д. придется отказаться от использования парсинга с помощью fscanf, и вообще переписывать всю программу.

CreateFile
_open_osfhandle
_fdopen
http://www.rusyaz.ru/pr — стараемся писАть по-русски
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.