Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
24 Робота з файлами у Windows.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
558.85 Кб
Скачать

24.5. Звільнення буферів файла

Часто декілька застосувань мають спільний доступ до одного і того ж файла. При цьому може знадобитися, щоб застосування, яке читає дані з файла, мало доступ до останньої версії цього файла. Для цього потрібно, щоб застосування, яке змінює вміст файла, фіксувало зміну файла після обробки потрібних записів. Через те, що не виключено, що останні оброблені записи зберігаються в буфері файла, то в цьому випадку потрібно звільнити буфер від записів. Виконати цю операцію можна за допомогою функції FlushFileBuffers(), яка має наступний прототип:

BOOL FlushFileBuffers(

HANDLE hFile); // дескриптор файла

У разі вдалого завершення ця функція повертає ненульове значення, інакше - false.

У Лістингу 24.3 приведена програма, в якій функція FlushFileBuffers() використовується для скидання даних з буферів у файл після запису половини файла.

// Лістинг 24.3 Звільнення буферів файла

#include "stdafx.h"

int main()

{

HANDLE hFile;

wchar_t lpszFileName[] = L"C:\\Users\\Shogun\\Documents\\demo_file.txt";

// створюємо файл для запису даних

hFile = CreateFile(

lpszFileName, // ім'я файла

GENERIC_WRITE, // запис у файл

FILE_SHARE_READ, // розділюване читання файла

NULL, // захисту немає

CREATE_ALWAYS, // створюємо новий файл

FILE_ATTRIBUTE_NORMAL, // звичайний файл

NULL // шаблону немає

);

// перевіряємо на успішність створення

if (hFile == INVALID_HANDLE_VALUE)

{

std::cerr << "Create file failed." << std::endl

<< "The last error code: " << GetLastError() << std::endl;

std::cout << "Press any key to finish.";

std::cin.get();

return 0;

}

// пишемо дані у файл

for (int i = 0; i < 10; ++i)

{

DWORD dwBytesWrite;

if (!WriteFile(

hFile, // дескриптор файла

&i, // адреса буфера, звідки йде запис

sizeof(i), // число байтів, які записуються

&dwBytesWrite, // число байтів, які записано

(LPOVERLAPPED)NULL // запис синхронний

))

{

std::cerr << "Write file failed." << std::endl

<< "The last error code: " << GetLastError() << std::endl;

CloseHandle(hFile);

std::cout << "Press any key to finish.";

std::cin.get();

return 0;

}

// якщо досягнули середини файла, то звільняємо буфер

if(i == 5)

{

if(!FlushFileBuffers(hFile))

{

std::cerr << "Flush file buffers failed." << std::endl

<< "The last error code: " << GetLastError() << std::endl;

CloseHandle(hFile);

std::cout << "Press any key to finish.";

std::cin.get();

return 0;

}

// тепер можна переглянути вміст файла

std::cout << "A half of the file is written." << std::endl

<< "Press any key to continue.";

std::cin.get();

}

}

// закриваємо дескриптор файла

CloseHandle(hFile);

std::cout << "The file is created and written." << std::endl;

std::cin.get();

return 0;

}

На завершення цього розділу зауважимо, що можна відмінити режим буферизації файла, встановивши прапорець file_flag_no_buffering в параметрі dwFlagsAndAttributes функції CreateFiie().

Проте в цьому випадку довжина записуваних або зчитуваних даних з файла має бути кратна розміру сектора. Наприклад, в ОС Windows довжина сектора дорівнює 512 байт.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]