Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практичне заняття № 5 МЗКІТ (10 ТП).DOCX
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
3 Мб
Скачать
☆

11.5,4. Файлові операції Win32 api

Win32 API містить набір функцій для роботи з файлами, багато в чому аналогіч¬них до системних викликів POSIX. Зупинимося на цьому наборі.

Відкриття і створення файлів

Аналогом системного виклику орепО у Win32 АРІ є функція CreateFile( ):

Першим параметром є ім’я файла. Параметр amode задає режим відкриття файла і може набувати значень GENERIC_READ (читання) і GENERIC_WRITE (записування). Параметр smode задає можливість одночасного доступу до файла: 0 означає, що доступ неможливий. Параметр cmode може набувати таких значень:

♦ CREATE_NEW - якщо файл є, повернути помилку, у протилежному випадку створити новий;

♦ CREATE_ALWAYS — створити новий файл, навіть якщо такий уже є;

♦ OPEN_EXISTING — якщо файл є, відкрити його, якщо немає, повернути помилку;

♦ OPEN_ALWAYS — якщо файл є, відкрити його, у протилежному випадку створити новий.

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

Ця функція повертає дескриптор відкритого файла. У разі помилки буде повернуто певне значення INVALID_HANDLE_VALUE, рівне -1.

Керування успадкуванням файлових дескрипторів

На відміну від POSIX, у Win32 відкриті файлові дескриптори за замовчуванням не успадковуються нащадками цього процесу, навіть якщо під час виклику CreateProcess( ) параметр inherit_handles встановлений у TRUE (див. n. 3.10.6). Потрібно додатково дозволити таке успадкування для кожного дескриптора при його відкритті. Це забезпечують установкою поля blnneritHandlе (третього один по одному) структури атрибутів безпеки, покажчик на яку передають у CreateFile( ). Зауважимо, що першим полем структури є її розмір, а друге описує права доступу для об’єкта і буде встановлюватися в NULL.

Закриття файлів

Для закриття дескриптора файла застосовують функцію CloseHandlе( ):

Читання і записування даних

Для читання з файла використовують функцію ReadFile( ):

Параметр buf задає буфер для розміщення прочитаних даних, len — кількість байтів, які потрібно прочитати, за адресою pbytes_read буде збережена кількість прочитаних байтів (коли під час спроби читання трапився кінець файла, *pbytes_read не дорівнюватиме len). Виклик ReadFile( ) поверне TRUE у разі успішного завершення читання.

Для записування у файл використовують функцію WnteFile( ):

Параметр buf задає буфер, з якого йтиме записування, 1еn — обсяг записуваних даних, за адресою pbytes_written буде збережена кількість записаних байтів. Виклик WriteFile( ) поверне TRUE, якщо записування завершене успішно.

Реалізація копіювання файлів

Наведемо приклад реалізації копіювання файлів за допомогою засобів Win32 АРІ.

Прямий доступ до файла

Прямий доступ до файла реалізований функцією SetFi1еРоі nter ( ):

Параметри offset і wnence аналогічні до однойменних параметрів 1seek ( ). Константи режиму переміщення визначені як FILE_BEGIN (аналогічно до SEEK_SET), FILE_CURRENT (аналогічно до SEEK_CUR) і FILE_END (аналогічно до SEEK_END).

Створення файла заданої довжини виконують аналогічно до прикладу для системного виклику 1seek ( ).

Збирання інформації про атрибути файла

Атрибути файла із заданим ім’ям можуть бути отримані за допомогою функції GetFileAttributesEx( ). Вона заповнює структуру WIN32_FILE__ATTRIBUTE_DATA з полями, аналогічними stat( ):

♦ dwFileAttributes — маска прапорців (зокрема, для каталогів задають прапорець FILE_ATTRIBUTE_DIRECTORY);

♦ ftCreationTime, ftLastAccessTime, ftLastWriteTime — час створення, доступу і модифікації файла (структури типу FILE1IME);

♦ nFileSizeLow — розмір файла (якщо для його відображення не достатньо

4 байт, додатково використовують поле nFileSizeHigh).

Для отримання доступу до атрибутів відкритого файла за його дескриптором використовують функцію GetFilelnformationByHandle( ). Вона дає змогу отримати повнішу інформацію із файла (зокрема, кількість його жорстких зв'язків).

Є також функції, що повертають значення конкретних атрибутів: