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

24.3. Закриття і видалення файлів

Для закриття доступу до файла, як і для закриття доступу до будь-якого іншого об’єкта ядра, використовується функція CloseHandle(), єдиним параметром якої є дескриптор відкритого файла.

Для фізичного видалення файла з диска використовується функція DeleteFile(), яка має наступний прототип:

BOOL DeleteFile(

LPCTSTR IpFileName); // ім’я файла

Єдиний параметр IpFileName є покажчиком на рядок, який вказує повний шлях до файла. При успішному завершенні функція повертає ненульове значення, інакше - false.

У лістингу 24.1 приведена програма, яка видаляє файл з ім’ям demo_file.dat, який розташований в кореневому каталозі на диску С:.

// Лістинг 24.1. Видалення файла

#include "stdafx.h"

int main()

{

wchar_t lpszNameFile[] = L"C:\\Users\\Shogun\\Documents\\demo_file.dat";

// видаляємо файл

if(!DeleteFile(lpszNameFile))

{

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

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

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

std::cin.get();

return 0;

}

std::cout << "The file is deleted." << std::endl;

return 0;

}

24.4. Запис даних у файл

Для запису даних у файл служить функція WriteFiie(), причому відмітимо, що ця функція може використовуватися як для синхронного, так і для асинхронного запису даних. Розглянемо тільки синхронний запис даних у файл. У цьому випадку дані записуються у файл послідовно - байт за байтом, і покажчик файла пересувається у міру запису даних на нову позицію. Асинхронне введення-виведення даних буде розглянуто пізніше.

Тепер розглянемо функцію WriteFile() детальніше. Ця функція має наступний прототип

BOOL WriteFile(

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

LPCVOID lpBuffer, // покажчик на буфер даних

DWORD nNumberOfBytesToWrite, // число байтів, які записуються

LPDWORD lpNumberOfBytesWritten, // число записаних байтів

LPOVERLAPPED lpOverlapped); // використовується при асинхронному записі

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

Параметр hFile повинен містити дескриптор файла, причому файл має бути відкритий в режимі запису.

Параметр lpBuffer повинен вказувати на область пам’яті, в яку читатимуться дані.

Параметр nNumberOfBytesToWrite повинен містити число байт, які передбачається записати у файл за допомогою виклику функції WriteFile().

Параметр lpNumberOfBytesWritten повинен містити адресу пам’яті, в яку функція WriteFile() помістить число фактично записаних байт. При виконанні функції WriteFile() ОС записує за цією адресою нуль, перш ніж виконати запис даних у файл.

Через те, що ми не розглядатимемо асинхронний запис даних у файл, то параметр lpOverlapped встановлюватиметься в null.

У лістингу 24.2 приведена програма, яка створює файл і записує в нього послідовність цілих чисел.

// Лістинг 24.2. Створення файла і запис в нього даних

#include "stdafx.h"

int main()

{

HANDLE hFile;

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

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

hFile = CreateFile(

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

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

0, // монопольний доступ до файла

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

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

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;

}

}

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

CloseHandle(hFile);

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

std::cin.get();

return 0;

}

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