Практика программирования (Бейсик, Си, Паскаль)



         

Задачи, советы и ответы - часть 7


Совет 2 (Си)

Для извлечения файлов из текущего или указанного каталога можно воспользоваться функциями findfirst(char *path, struct ffblk sr, int attr) и findnext (struct ffblk sr}. Аргумент path является указателем на маску отбора файлов (например — "*.с"), расширенную спецификацию маски (например — "с: \bc\source\* .с") или просто путь (например — "c:\bc"). Аргумент sr представляет собой структуру типа ffblk, на поля которой заносятся атрибуты найденного набора. Эта структура описана в файле dir. h и имеет следующие поля:

struct ffblk {

char ff_reserved[21]; //резерв на будущее

char ff_attrib; //атрибут набора данных

unsigned ff_ftime; //упакованное время создания

unsigned ff_fdate; //упакованная дата создания

long ff fsize; //длина набора в байтах

char ff_name[13]; //имя набора

};

Третий аргумент определяет атрибуты, которыми должен быть снабжен отбираемый набор данных, и может принимать разумную логическую сумму из значений, определенных в файле dos. h и задаваемых в Си следующими константами:

  • FA_RDONLY отбирать файлы с признаком только для чтения;

  • FA_HIDDEN — отбирать файлы с признаком "Скрытый";

  • FA_SYSTEM —отбирать системные файлы;

  • FA_LABEL — отбирать наборы с меткой "Идентификатор тома";

  • FA_DIREC — отбирать каталоги;

  • FA_ARCH — отбирать файлы с признаком "Архивировать".

    Цикл поиска нужных наборов данных начинается с обращения к процедуре f indf irst (поиск первого объекта) и повторяется многократными обращениями к процедуре findnext (поиск следующего объекта). Аргумент sr в обоих обращениях должен быть один и тот же. Цикл поиска продолжается до тех пор, пока функция поиска возвращает нулевое значение. Как только очередная попытка окажется неудачной, функция поиска возвращает значение -1.

    Совет 3 (Си)

    Самый кропотливый момент в программе связан с выводом упакованных значений времени и даты последнего обновления файла, т. к. в системной библиотеке Си подходящей функции распаковки нет. Поэтому в программе 7_07.с введены две структуры битовых полей, эквивалентные способам упаковки даты (struct dat) и времени (struct tim). Обратите внимание на последовательность описания битовых полей — от младших разрядов слова к старшим (а не наоборот). С помощью объединения union данные указанных структур накладываются на беззнаковые целочисленные (unsigned) переменные, в которые предварительно переписываются упакованные данные. Последующее извлечение содержимого битовых полей использует соответствующие составные имена, например из упакованного значения даты v.d извлекаются разряды, в которых находится номер дня v.c.day. Единственное изменение содержимого поля v.с.year связано с тем, что функции поиска в MS-DOS возвращают значение года, уменьшенное на 1980.




    Содержание  Назад  Вперед