Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс ПЯВУ 2 сем / Лекции 2 сем / Л№36.Библиотека стандартных программ / Лекция № 33. Библиотека стандартые функции.odt
Скачиваний:
15
Добавлен:
17.04.2015
Размер:
54.36 Кб
Скачать

11. Работа с каталогами файловой системы

Прототипы функций, описанных в табл. 8.15, содержатся в стандартном заголовочном файле dir.h. Не все функции описаны в стандарте языка Си, но обычно все они предоставляются комилятором.

Таблица 15. Функции для работы с каталогами

________________________________________________________________________________

Функция Краткое описание

________________________________________________________________________________

chdir int chdir(const char *path); изменение текущего каталога, заданного полным

или относительным путем path. Возвращает 0 в случае успеха, -1 в случае

ошибки

getcwd char *getcwd(char *buf, int buflen); получить имя текущего рабочего

каталога. В случае успеха buf!=NULL. Ограничения, такие как MAXPATH

(макс. длина пути к каталогу) определены в <dir.h>. Аналог - int getcurdir

(int drive, char *directory); Диск по умолчанию кодируется как 0, 1

обозначает диск A: и т. д.

mkdir int mkdir(const char *path); пытается создать новый каталог, заданный

полным или относительным путем path. В случае успеха вернет 0, иначе -1

rmdir int rmdir(const char *path); удаление каталога, заданного путем path. В

случае успеха вернет 0, иначе -1

findfirst int findfirst(const char *pathname, struct ffblk *ffblk, int attrib); начинает поиск

файла по шаблону имени pathname. для работы с поиском определен

структурный тип ffblk:

________________________________________________________________________________

struct ffblk {

long ff_reserved;

long ff_fsize; //размер файла

unsigned long ff_attrib;//атрибуты

unsigned short ff_ftime; //время

unsigned short ff_fdate; // дата

char ff_name[256]; //найденное имя

};

Атрибуты определены в библиотеке dos.h:

FA_RDONLY Read-only

FA_HIDDEN Hidden

FA_SYSTEM System

FA_LABEL Volume label

FA_DIREC Directory

FA_ARCH Archive

Поле ff_ftime определяет время следующим образом: биты от 0 до 4 обозначают секунды, деленные на 2, биты 5-10 - минуты, биты 11-15 - часы.

Поле ff_fdate определяет дату следующим образом: биты 0-4 обозначают день месяца, биты 5-8 - номер месяца, биты 9-15 - год с 1980 (например, 9 означает 1989). В случае успеха вернет 0, иначе -1

findnext int findnext(struct ffblk *ffblk); продолжает поиск файла по ранее

указанному для findfirst шаблону имени

fnmerge void fnmerge(char *path, const char *drive, const char *dir, const char *name,

const char *ext); создает полное имя файла из отдельных компонент

fnsplit int fnsplit(const char *path, char *drive, char *dir, char *name, char *ext);

разбивает полное имя файла на отдельные компоненты. Вернет целое

число, биты которого показывают наличие отдельных компонент

getdisk int getdisk(void); возвращает номер текущего диска. 0 обозначает диск A:, 1 -

B: и т. д.

searchpath char *searchpath(const char *file); выполняет поиск файла в каталогах,

перечисленных в системной переменной PATH. Если файл найден, вернет

полный путь к нему в статическом буфере (обновляется при каждом вызове

функции)

setdisk int setdisk(int drive); задает текущее дисковое устройство. Диски обознача-

ютсякак для getdisk. Возвращает общее число дисков, доступных в

системе

________________________________________________________________________________

Приведенный далее пример формирует листинг из всех файлов текущего каталога.

#include <stdio.h>

#include <dos.h>

#include <dir.h>

int main(void) {

struct ffblk ffblk;

int done;

printf("Directory listing of *.*\n");

done = findfirst("*.*",&ffblk,

FA_ARCH|FA_DIREC);

while (!done) {

unsigned t=ffblk.ff_ftime;

char s=(t&0x001F)<<1, m=(t&0x07E0)>>5,

h=(t&0xF800)>>11;

t=ffblk.ff_fdate;

char d=(t&0x001F), mon=(t&0x01E0)>>5;

int y=(t&0xFE00)>>9;

printf("%s %15ld \

%02d/%02d/%4d,%02d:%02d:%02d\n",

ffblk.ff_name,ffblk.ff_fsize,

d,mon,y+1980,h,m,s);

done = findnext(&ffblk);

}

getchar(); return 0;

}

В следующем примере иллюстрируется работа с функцией fnsplit.

#include <stdlib.h>

#include <stdio.h>

#include <dir.h>

char *s;

char drive[MAXDRIVE];

char dir[MAXDIR];

char file[MAXFILE];

char ext[MAXEXT];

int flags;

s=getenv("COMSPEC");

flags=fnsplit(s,drive,dir,file,ext);

printf("Command processor info:\n");

if(flags & DRIVE)

printf("\tdrive: %s\n",drive);

if(flags & DIRECTORY)

printf("\tdirectory: %s\n",dir);

if(flags & FILENAME)

printf("\tfile: %s\n",file);

if(flags & EXTENSION)

printf("\textension: %s\n",ext);