Доброго времени суток.
Помогите решить проблему. Я записываю некие данные на диск, после чего мне необходимо проверить "качество записи"(посчитать контрольную сумму и т.д).
Проблем азаключается в том что Windows автоматически кэширует данные и при проверке не пытается считать их с диска. Подскажить как запретить Windows пользоваться кэшем(может можно его очистить после записи?).
Спасибо за внимание.
Здравствуйте, Аноним, Вы писали:
А>Доброго времени суток. А>Помогите решить проблему. Я записываю некие данные на диск, после чего мне необходимо проверить "качество записи"(посчитать контрольную сумму и т.д). А>Проблем азаключается в том что 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?
На счет этой функции: я так понял, что она очищает "буфер передатчика",т.е. с ее помощью можно заставить систему записать все прокэшированные данные на диск(чтобы можно было его извлеч например).
Провел эксперимент:
Здравствуйте, Аноним, Вы писали:
А>Проблема в том что я пользуюсь функциями fopen/fscanf...(программа переделана из DOS для Windows), а если использовать CreateFile и т.д. придется отказаться от использования парсинга с помощью fscanf, и вообще переписывать всю программу.
Здравствуйте, ekamaloff, Вы писали:
E>Может тогда fflush?
К сожаленью тоже не подходит.
fflush аналогична FlushFileBuffers(для справки: flush — сбрасывать на диск, взято из Lingvo)
Эти функции сбрасывают кэш при записи на диск.
А нужно произвести чтение с диска игнорируя кэш.
В принципе для этого подходит CreateFile с параметром FILE_FLAG_NO_BUFFERING, видимо придется переделывать программу.
Re[5]: Отключить кэширование диска(опять не помогло)
Здравствуйте, 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]: Отключить кэширование диска(опять не помогло)
_>можешь переписать fopen. Например, найти код fopen в CRT и включить его в свою программу. Потом добавить флаг FILE_FLAG_NO_BUFFERING.
Так просто не выйдет. При записи в файл с FILE_FLAG_NO_BUFFERING требуется соблюдать кучу условий (см. MSDN), которые программа с fopen явно не соблюдает.
И вообще, я бы обратил внимание еще на флаг FILE_FLAG_WRITE_THROUGH.
А>Спасибо за быстрый ответ, но к сожаленью не помогло.
E>>FILE_FLAG_NO_BUFFERING? А>Проблема в том что я пользуюсь функциями fopen/fscanf...(программа переделана из DOS для Windows), а если использовать CreateFile и т.д. придется отказаться от использования парсинга с помощью fscanf, и вообще переписывать всю программу.