- •24.1. Іменування файлів у Windows
- •24.2. Створення і відкриття файлів
- •24.3. Закриття і видалення файлів
- •24.4. Запис даних у файл
- •24.5. Звільнення буферів файла
- •24.6. Читання даних з файла
- •24.7. Копіювання файла
- •24.8. Переміщення файла
- •24.9. Заміщення файла
- •24.10. Робота з покажчиком позиції файла
- •24.11. Визначення і зміна атрибутів файла
- •24.12. Визначення і зміна розмірів файла
- •24.13. Блокування файла
- •24.14. Отримання інформації про файл
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;
}
