- •1. Основные отличия стандартной библиотеки Си от других
- •2. Определение класса символов и преобразование символов
- •3. Работа с областями памяти и строками
- •4. Функции преобразования типов
- •5. Математические функции
- •6. Динамическое распределение памяти
- •7. Функции стандартного ввода и вывода
- •8 . Функции ввода/вывода высокого уровня
- •9. Функции ввода/вывода нижнего уровня
- •10. Функции ввода/вывода с консольного терминала
- •11. Работа с каталогами файловой системы
- •12. Операции над файлами
- •13. Использование вызовов операционной системы
- •14. Управление процессами
- •15. Поиск и сортировка
- •16. Функции для работы с датой и временем
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);