Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lec_11_Pres.doc
Скачиваний:
4
Добавлен:
05.12.2018
Размер:
377.86 Кб
Скачать

10. Інші засоби для роботи з файлами

10.1. Функції <dir.h> для роботи з каталогами та файлами

Додаткові можливості щодо роботи з файлами та каталогами MS DOS надають програмістові бібліотечні функції Borland C, прототипи яких оголошені в заголовному файлі <dir.h>. Серед них:

  • getdisk( )/setdisk() - визначення/зміна поточного системного диска;

  • mkdir ()/chdir ()/rmdir () - створення/зміна/витирання каталога;

  • getcurdir ()/getcwd () - визначення активного каталога для поточного або заданого диска;

  • mktemp () - генерування унікального імені файла; І.

  • • findf irst ()/findnext () - пошук у заданому каталозі першого/наступного файлу, ім'я якого відповідає вказаному шаблону;

  • fnsplit () - формування повного імені файла зі складових частин;

  • searchpath () - визначення шляху до файла.

10.2. Низькорівневе звертання до файлів

Як вже зазначалось на початку розділу, функції низькорівневого файлового обміну даними є системно і апаратно залежними, тому вони не підтримуються стандартом мови С. Операції введення/виведення даних на низькому рівні в середовищі Borland С базуються на засобах файлового обміну MS DOS.

Ці операції блокоорієнтовані, не використовують проміжної буферизації і не здійснюють форматування даних.

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

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

Прототипи функцій, які реалізують роботу з файлами на низькому рівні, записані в заголовному файлі <іо.h>. Основними серед них є:

  • open ()/creat () - відкрити/створити файл;

  • sopen () - відкрити файл для спільного використання декількома процесами;

  • read ()/write () - читання/запис даних;

  • lseek () - позиціювання покажчика поточної позиції файла;

  • tell () - визначення поточної позиції файла;

  • eof () - перевірка досягнення кінця файла;

  • close () - закриття файла.

Якщо файл відкрито для потокоорієнтованого обміну, то значення дескриптора можна отримати через функцію

int fileno (FILE* fp);

оголошену в <stdio.h>. Функція повертає дескриптор файлу, пов'язаного з потоком fр.

Це дає змогу додатково до функцій високорівневого обміну даними застосо­вувати до файла з потоку fр необхідні функції з <іо.h>.

Зокрема, корисною може бути функція

long filelength (int handle);

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

Раніше для визначення розміру файлу ми розробили окрему функцію FileSize (), в якій використали декілька стандартних бібліотечних функцій: fseek (), ftell (), fgetpos () та fsetpos (). Через filelength () розмір файлу, пов'язаного з потоком fp, можна знайти так:

/* Визначення розміру файлу */

#include <stdio.h>

#include <io.h>

FILE *fp;

long fsize;

. . . /* відкриття файлу функцією fopen () */

Fsize = filelength( fileno (fp) );

Корисною для багатьох практичних задач є також функція

int chsize (int handle, long newsize);

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

chsize (fileno(fp), 250);

обмежить розмір файлу, пов'язаного з потоком fp, 250-ма початковими байтами. Функція chsize () повертає нуль у разі успішного виконання та -1 у разі невдачі.

Дві наступні функції:

int getftime (int handle, struct ftime * timebuf);

int setftime (int handle, struct ftime * timebuf);

дають змогу отримати/встановити дату і час системної реєстрації файлу, заданого дескриптором handle. Дані заносяться в змінну (чи ділянку пам'яті) або відповідні зчитуються зі змінної (чи ділянки пам'яті), на яку вказує timebuf. Змінна, адресу якої задає параметр timebuf, повинна бути структурою, точніше - полем бітів зі шаблоном struct ftime, оголошеним в <іо.h>. Шість полів цієї структури призначені для збереження року, місяця, дня, години, хвилин і секунд, що характеризують часові параметри файлу. Функція повертає нуль у разі успішного виконання та значення -1 якщо виникає помилка.

Інформацію про відкритий файл можна отримати також за допомогою функції fstat ( ), оголошеної в <sysstat.h>:

int fstat (int handle, struct stat* statbuf);

Перший параметр функції fstat ( ) - handle задає дескриптор файлу, а другий -statbuf вказує адресу змінної (ділянки пам'яті), куди будуть записані дані. Відповідна змінна повинна бути структурою, що має встановлений шаблон struct stat.

У разі успішного виконання функції в поля цієї структури заноситься інформація про файл а саме: диск, на якому записаний файл, режими відкриття файлу і доступу до нього розмір файлу в байтах, час останньої модифікації файлу тощо. Функція повертає нуль у разі нормального завершення та -1, якщо зафіксовано помилку.

65/65

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