Управление файлами и директориями
Сюда относятся функции, прототипы которых расположены в файлах dir.h, io.h, sys/stat.h, stdio.h, dos.h, time.h.
Эти функции позволяют сделать следующеее:
· создать и удалить субдиректорий любого директория, в т.ч. корневого,
· определить номер текущего активного накопителя и текущий директорий,
· выполнить поиск файла или директория, удовлетворяющего определенным критериям, соответствующим атрибутам «только читаемый», «системный», «архивный» и т.д. (возможен поиск совокупности файлов),
· выполнить сборку и разборку спецификации пути к файлу, содержащей информацию о накопителе, маршруте и т.д.,
· изменить форму доступа к файлу – перейти от потоковой к префиксной форме и наоборот,
· выполнить удаление, переименование файлов и создать резервные копии, при этом возможна автоматическая генерация уникальных имен независимо от пользователя,
· выяснить существование заданного имени файла или директория, переустановить для них параметры или прочитать эти параметры, такие как – размер файла, дата обновления, дата создания, биты прав доступа и пр.,
· выяснить текущее состояние файла – открыт ли, достигнута ли метка конца файла, переустановить режим доступа к открытому файлу и т.д.
Пример
В программе выполняется поиск всех файлов и директориев в соответствии с заданным шаблоном, вводимым в качестве 1-го параметра при запуске программы из командной строки. Шаблон может содержать символы - *, ? и т.д.
void print_element (struct ffblk *);
int main (int argc, char **argv)
{
int new_drive;
static struct ffblk my;
……………………….
// проверка числа введенных аргументов
………………………..
//проверка правильности указания накопителя
if(strchr(argv[1], (int)’:’) != NULL)
{
new_drive = toupper((int)argv[1]) – ‘A’;
if(setdisk(new_drive) < new_drive)
{
printf(“\a%s\n”, “Задан несуществующий накопитель!”);
exit(2);
}
}
// первая попытка поиска
if(findfirst(argv[1], &my, 0xff) == -1)
{
printf(“\a%s\n”, “Нет файлов или директориев, удовл-х шаблону!”);
exit(3);
}
print_element(&my);
// продолжение поиска
while(findnext(&my) == 0)
print_element(&my);
exit(0);
}
Комментарий к этой программе следующий:
· функция strchr() определяет первое вхождение «:» в строку, соответствующую 1-му аргументу,
· функция int setdisk(int drive) выполняет установку накопителя, заданного параметром drive, - ‘A’, соответствует 0, ‘B’, соответствует1 и т.д.; в случае неуспеха возвращается -1, иначе общее число накопителей в системе,
· функция int findfirst(const char* filename, struct ffblk *ffblk, int attrib) ищет 1-й файл, заданный именем filename, удовлетворяющий атрибутам attrib; в случае успеха возвращает 0 и заполняет структурную переменную ffblk, иначе возвращает -1, (struct ffblk содержится в dir.h. выписать 1-е 10 строк)
· функция findnext() продолжает поиск и возвращает -1 в случае неуспеха или возвращает 0 в случае успеха,
· функция print_element() пользовательская – выполняет распечатку найденных параметров (ее реализация должна быть выполнена в качестве упражнения).
Самостоятельно – выяснить что означает значение 0xff? Для этого следует рассмотреть содержимое файла dos.h и в нем константы, начинающиеся с “/FA_”, и проанализировать спецификацию функции findfirst()!
Вопросы для самоконтроля
- Охарактеризуйте 2 группы функций ввода и вывода!
- Чем различаются текстовый и бинарный режимы работы с файлами?
- Как можно выполнить установку режима из программы?
- В каком файле располагаются символьные константы, определяющие возможные состояния открытого файла?
- Какой тип структурной переменной соответствует открытому потоку ввода или вывода?
- Охарактеризуйте режим открытия файла “a+”!
- Охарактеризуйте режим открытия файла “r+t”!
- Охарактеризуйте режим открытия файла “w+b”!
- Какие функции и каким образом могут быть использованы для анализа ошибок открытия, закрытия файлов и операций ввода и вывода?
- Что выполняют функции perror() и strerror()?
- Какую информацию содержат переменные sys_nerr и sys_ errlist в stdlib.h?
- Какие функции выполняют закрытие файловых потоков?
- Перечислите имена потоков стандартного ввода и вывода!
- На какие 4 группы делятся функции потокового ввода и вывода?
- Что содержат функции fprintf() и fscanf() в качестве 1-го и 2-го аргументов?
- Перечислите операции, которые можно выполнить на основе применения функций управления файлами и директориями!
Вопросы для самостоятельного изучения
· В stdlib.h или errno.h просмотреть возможные коды в errno. Определить максимальный код!
· Выписать 1-е 10 строк struct ffblk, описание которого содержится в dir.h!
· Выяснить что означает значение 0xff (см. представленный выше пример)!
Дата добавления: 2016-05-26; просмотров: 1698;