ИНФОРМАЦИЯ: FILE_FLAG_WRITE_THROUGH и FILE_FLAG_NO_BUFFERING

Обзор

Флаг FILE_FLAG_WRITE_THROUGH для CreateFile() заставляет все записи, внесенные в этот дескриптор записывается непосредственно в файл без буферизованные. Кэширование данных (хранятся в кэше диска); Тем не менее он по-прежнему записывается непосредственно в файл. Этот метод позволяет операции чтения этих данных для удовлетворения запроса на чтение из кэшированных данных (если она по-прежнему существует), вместо того, чтобы сделать файл читать для получения данных. Вызов записи не осуществляет возврат до записи данных в файл. Это относится к удаленной записи также--передает сетевой перенаправитель, флаг FILE_FLAG_WRITE_THROUGH для сервера таким образом, сервер может не удовлетворить запрос на запись, пока данные записываются в файл.


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


Эти ограничения необходимы, так как буфер передачи для чтения или записи API используется непосредственно для ввода-вывода на уровне устройства; на этом уровне адреса буфера и размеров сектора должны удовлетворять любые ограничения Выравнивание процессора и мультимедиа оборудования, которое работает под управлением.

Дополнительные сведения

Windows 95 CDFS (файловая система для компакт-диска) не поддерживает флаг FILE_FLAG_NO_BUFFERING для CreateFile(). FSD Windows 95, например VFAT, он может реализовать, FILE_FLAG_NO_BUFFERING не требуется флаг для драйверы файловой системы, а не поддерживается CDFS.


Этот фрагмент кода демонстрирует сектор выравнивание данных в буфер и передайте его в CreateFile().

  char buf[2 * SECTOR_SIZE - 1], *p;
p = (char *) ((DWORD) (buf + SECTOR_SIZE - 1) & ~(SECTOR_SIZE - 1));
h = CreateFile(argv[1], GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING, NULL);
WriteFile(h, p, SECTOR_SIZE, &dwWritten, NULL);


Указатель p выравнивается сектора и указывает в буфере.


Если у вас есть ситуации, где требуется очистить все открытые файлы на текущий логический диск, это можно сделать:

   hFile = CreateFile("\\\\.\\c:", ....);   FlushFileBuffers(hFile);

Этот метод вызывает все данные буферизованной записи для всех открытых файлов на диске C: очищены и записываются на диск. Обратите внимание, что любые выполненную ничего, кроме система буферизации не влияет эта Очистка; любой файл буферизации, что делает для файлов, открытых процедур времени выполнения C времени выполнения C не влияет.


При открытии удаленного файла по сети, сервер всегда кэширует и не обрабатывает без буферизации флаг, указанный клиентом. Это сделано намеренно. Перенаправитель и сервер не может реализовать должным образом полная семантика FILE_FLAG_NO_BUFFERING по сети. В частности не может быть удовлетворена потребность размера сектора, выровнены сектор ввода-вывода. Таким образом когда приложения на основе Win32-запрашивает FILE_FLAG_NO_BUFFERING, перенаправления и сервер помечено как запрос для FILE_FLAG_WRITE_THROUGH. Файл не кэшируются на стороне клиента, записывает перейти непосредственно на сервер и на диске на сервере и размеры чтение и запись в сети не точно запрашивает у приложения. Тем не менее файл кэшируется на сервере.


Кэширование клиента не может иметь различные эффект, в зависимости от типа операций ввода-вывода. Можно избежать попаданий в кэш или чтения с опережением, но также может уменьшить размер передает и принимает. В общем случае для последовательного ввода-вывода, это хороший способ кэширования на стороне клиента. Для небольших произвольного доступа ввода-вывода, рекомендуется часто не в кэш.
Свойства

Номер статьи: 99794 — последний просмотр: 12 янв. 2017 г. — редакция: 1

Отзывы и предложения