- •Работа с файловой системой dos
- •Получение справочной информации
- •Void far *drv_addr;
- •24.11Стандартные библиотеки трансляторов Microsoft qc 2.5 и Borland содержат несколько функций, облегчающих получение справочной информации о состоянии дисковой подсистемы.
- •Void _dos_getdrive(unsigned *drive);
- •Void _dos_setdrive(unsigned drive, unsigned *drivecount);
- •Void main(void);
- •Void main(void) {
- •Создание, удаление и переименование каталогов
- •Void main(void);
- •Void main(void) {
- •Void main(void);
- •Void main(void) {
- •If(!mkdir(test_dir)) {
- •Int rename(char *oldname, char *newname);
- •Поиск в каталогах
- •Int _dos_findfirst(char *pattern, struct find_t *found, unsigned attr);
- •Int _dos_findnext(struct find_t *found);
- •Void print_info(struct find_t *pfind) {
- •Работа с файлами
- •Int creat(char *filename, int mode);
- •Int open(char *filename,
- •Int oflag [, int pmode]);
- •Int close(int handle);
- •3.5. Чтение/запись файлов
- •Int write(int handle, void *buffer, unsigned count);
- •Int read(int handle, void *buffer, unsigned count);
- •Void main(int, char *[]);
- •Void main(int argc, char *argv[]) {
- •Int source, taget, I;
- •Int eof(int handle);
- •3.6. Позиционирование
- •Void main(void);
- •Void main(void) {
- •Int handle;
- •3.7. Изменение атрибутов, времени и даты файлов
- •Void main(int argc, char *argv[]);
- •Void main(int argc, char *argv[]) {
- •3.8. Буферизация ввода/вывода
- •Int _cnt; // количество оставшихся байтов
- •Int fclose(file *stream);
- •Int fileno(file *stream);
- •Int fseek(file *stream, long offset, int origin);
- •Int fgetpos(file *stream, fpos_t *pos);
- •Int fsetpos(file *stream, fpos_t *pos);
- •Int fputc(int c, file *stream);
- •Int fgetc(file *stream);
- •Int fputs(char *string, file *stream);
- •Int fgets(char *string, int n, file *stream);
- •Int fprintf(file *stream, char *format [,arg]...);
- •Int fscanf(file *stream, char *format [,arg]...);
- •Void setbuf(file *stream, char *buffer);
- •Int setvbuf(file *stream, char *buffer, int mode,
- •Int fflush(file *stream);
- •Void filecpy(file *stream_from, file *stream_to);
- •Void main(int argc, char *argv[]) {
- •Void filecpy(file *stream_from, file *stream_to) {
- •3.9. Другие функции для работы с файлами
- •Int setmode(int handle, int mode);
- •Void rewind(file *stream);
- •Int dup(int handle);
- •Int dup2(int handle1, int handle2);
- •3.10. Таблица открытых файлов
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:
