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

Void main(void);

Void main(void) {

printf("\nТекущий каталог: %s\n",

getcwd(NULL,70));

}

Для создания и удаления каталогов, изменения текущего каталога имеются функции mkdir(), rmdir(), chdir().

Все эти функции имеют один параметр - путь каталога, который имеет тип (char_*). В случае успешного выполнения операции функции возвращают 0, при ошибке - 1.

Приведем небольшой пример, использующий перечисленные выше функциии:

#include <direct.h>

#include <stdlib.h>

#include <stdio.h>

Void main(void);

Void main(void) {

char current_dir[_MAX_DIR];

// _MAX_DIR - максимальная длина

// пути для каталога.

// Эта константа описана в файле stdlib.h

char test_dir[] = "TEST_DIR";

// Запоминаем текущий каталог:

getcwd( current_dir, _MAX_DIR );

// Пытаемся создать в текущем каталоге

// новый каталог

If(!mkdir(test_dir)) {

// Если удалось создать каталог, делаем его

// текущим

chdir(test_dir);

printf(“\nКталог создан,”

“для удаления нажмите”

“\nлюбую клавишу,”

“ для сохранения - Ctrl-C”);

getch();

// Для удаления только что созданного

// каталога возвращаемся в каталог

// более высокого уровня:

chdir(current_dir);

rmdir(test_dir);

}

// Если каталог с таким именем уже

// существует или произошла другая ошибка

// при создании каталога, выводим сообщение

// о невозможности создания каталога.

else printf(“\nНевозможно создать”

“каталог!”);

}

Для переименования каталогов (и файлов) предназначена функция rename():

Int rename(char *oldname, char *newname);

Способ ее использования очевиден: необходимо задать старое и новое имена каталогов. Можно задавать как полный путь, так и просто имя каталога/файла. В последнем случае операция переименования выполняется над каталогами или файлами, находящимися в текущем каталоге.

Функция может возвращать один из кодов ошибки:

ENOENT

Нет такого файла или каталога

EACCES

Нет прав доступа

EXDEV

Другой диск

Код ошибки EXDEV возвращается в том случае, когда программа указывает разные диски для старого и нового имен файлов или каталогов.

Важное замечание: если вы задаете полный путь, в строке пути повторяйте символ '\' два раза. Это нужно для того, чтобы избежать конфликта с форматом представления констант в языке С. Например:

ret_code = rename("c:\\games","c:\\games_new");

Поиск в каталогах

Часто перед программистом стоит задача определения текущего содержимого каталога. При описании логической структуры диска мы приводили текст программы, выводящей на экран содержимого корневого каталога и других каталогов. Эта программа использовала загрузочный сектор логического диска и таблицу размещения файлов. Вы можете использовать такой способ, однако, если вам не требуется информация о номерах начальных кластеров файлов и дескрипторы удаленных файлов, лучше применить специальные функции MS-DOS, предназначенные для поиска файлов в каталогах.

Пара функций 4Eh и 4Fh предназначены для сканирования каталогов. Эти функции используются вместе следующим образом:

  • Вызывается функция 4Eh для поиска в каталоге файла, соответствующего образцу. В образце можно использовать символы ? и *, которые означают, соответственно, один любой символ и любое количество любых символов. Информация о найденном файле располагается в специальной области, назначенной каждой работающей программе - области DTA.

  • Вызывается в цикле функция 4Fh для поиска остальных файлов, удовлетворяющих образцу, заданному при вызове функции 4Eh. Условие завершения цикла - отсутствие в каталоге указанных файлов.

Приведем формат вызова функций 4Eh и 4Fh.

Функция 4Eh:

На входе:

AH = 4Eh

CX = Атрибуты файла, которые будут использованы при поиске. Будут найдены файлы, имеющие заданный в этом регистре атрибут.

DS:DX = Адрес строки в формате ASCIIZ, содержащей путь каталогаили файла.

На выходе:

AL = Код ошибки, если был установлен в 1 флаг переноса CF.

Функция 4Fh:

На входе:

AH = 4Fh

На выходе:

AL = Код ошибки, если был установлен в 1 флаг переноса CF.

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

Для работы с областью DTA MS-DOS имеет две функции. Это функция 2Fh, позволяющая получить адрес области DTA (она возвращает этот адрес в регистрах ES:BX), и функция 1Ah, предназначенная для установки своей области DTA (адрес новой области DTA должен быть указан в регистрах DS:DX).

Напомним, что по умолчанию область DTA занимает 128 байтов в префиксе сегмента программы PSP со смещением 80h.

В случае успешного поиска функции 4Eh и 4Fh помещают в DTA информацию о найденных файлах в следующем формате:

(0)

20

Зарезервировано.

(+21)

1

Атрибуты найденного файла

(+22)

2

Поле времени последнего обновления фалйла

(+24)

2

Поле даты последнего обновления файла

(+26)

4

Длина файла

(+30)

13

Имя файла и расширение в формате ASCIIZ

Номер начального кластера, распределенного файлу или каталогу, невозможно получить с помощью функций 4Eh и 4Fh.

Стандартные библиотеки трансляторов Microsoft QC 2.5 и C 6.0 содержат две функции, предназначенные для сканирования каталогов - _dos_findfirst() и _dos_findnext().

Приведем прототипы этих функций, описанные в файле dos.h: