Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лаб по С и С++ / Лаб_С_№14

.doc
Скачиваний:
67
Добавлен:
17.03.2015
Размер:
49.15 Кб
Скачать

/* ЛАБОРАТОРНАЯ РАБОТА 14 (DIR_FILE)

УПРАВЛЕНИЕ НАКОПИТЕЛЯМИ, КАТАЛОГАМИ, ФАЙЛАМИ

Управление накопителями

Прототипы функций описаны в заголовочном файле dir.h.

int getdisk(void); - функция возвращает номер текущего диска (0 - A, 1 - B, 2 - C и т.д.).

int setdisk(int drive); - функция устанавливает текущим диск в соответствии с drive (0 - A, 1 - B, 2 - C и т.д.).

Управление каталогами

Прототипы всех функций описаны в заголовочном файле dir.h.

В некоторых функциях используются строки, максимальная длина которых указана в макроопределениях с учетом '\0':

MAXPATH (значение - 80) - путь

MAXDRIVE (значение - 3) - диск, включая двоеточие

MAXDIR (значение - 66) - каталог, включая '\'

MAXFILE (значение - 9) - файл

MAXEXT (значение - 5) - расширение, включая '.'

int chdir(const char *path); - функция изменяет текущий каталог в соответствии с path. Поиск ведется на текущем диске. Имя каталога задается относительно текущего или корневого каталога. Возврат при ошибке: 1.

int mkdir(const char *path); - функция создает один каталог с именем, определенным path. Возврат при ошибке: -1.

int rmdir(const char *path); - функция удаляет один каталог с именем, определенным path. Каталог должен быть пустым, не текущим, не корневым. Возврат при ошибке: 1.

int getcurdir(int drive, char *directory); - функция читает имя текущего каталога на устройстве drive (0 - по умолчанию, 1 - A, 2 - B, 3 - C и т.д.). Результат - в directory. Имя каталога не включает имя корневого каталога. Возврат при ошибке: -1.

char *getcwd(char *buf, int buflen); - функция читает полное имя текущего каталога (включая диск) в buf размером не более buflen. Результат - указатель на строку вида: C:\FFF\YYY. Возврат при ошибке: NULL.

int findfirst(const char *path, struct ffblk *ffblk, int attrib);

Функция ищет первый файл или каталог с данным именем и аттрибутом. Имя с указанием пути и диска ( возможно использование ? и * в имени). Атрибут (attrib) может иметь значения (необходимо пдключить dos.h):

0 - файл для чтения и записи

FA_RDONLY - файл для чтения

FA_HIDDEN - скрытый файл

FA_SYSTEM - системный файл

FA_LABEL - метка тома

FA_DIREC - каталог

FA_ARCH - архив.

Для найденного файла или каталога заполняется структура ffblk, cодержащая*/

char ff_reserved[21];

char ff_attrib; /* атрибут */

unsigned ff_ftime; /* время */

unsigned ff_fdate; /* дата */

long ff_fsize; /* размер */

char ff_name[13]; /* имя */

/*Возврат при ошибке: -1.

int findnext(struct ffblk *ffblk); - функция возвращает следующий файл или каталог с заданным именем и атрибутом (см.выше).

char *searchpath(const char *file); - поиск файла по имени сначала в текущем каталоге, а затем по установленным путям поиска. Результат - адрес строки с полным именем файла, начиная с имени диска.

/*Возврат при ошибке: NULL.

void fnmerge(char *path,const char *drive,const char *dir, const char *name, const char *ext);

Функция создает полное имя файла (path) из отдельных компонент: имя диска, каталога (путь), файла, расширения.

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

Функция разбивает полное имя (path) на составляющие компоненты (обратная fnmerge), каждая компонента обязательна, но может быть нулевой строкой.

Управление файлами

Временный файл

Прототипы функций описаны в заголовочном файле stdio.h.

char *tmpnam(char *s); - функция генерирует имя временного файла и помещает его в строку с указателем s. Возврат при ошибке: NULL.

FILE * tmpfile (void); - создает и открывает временный файл в режиме "w+", возвращает указатель потока. После выполнения программы временные файлы удаляются. Возврат при ошибке: NULL.

int rmtmp(void) - функция удаляет временные файлы, созданные с помощью tmpfile, в текущем каталоге. Возвращает число удаленных файлов.

Генерация имени

char *mktemp(char *template); - прототип в dir.h.

Функция создает уникальное имя с помощью модификации заданного имени template вида baseXXXXXX, где base - задается пользователем, XXXXXX - формируется функцией.Результат - адрес строки с именем. Возврат при ошибке: NULL.

Доступ к файлу

Прототипы функций в заголовочном файле io.h.

int access(const char *path, int amode); - функция проверяет существование файла и режимы доступа к нему (amode): 00 - существование, 04 - чтение, 02 - запись, 06 - чтение/ запись). Возврат: 0 - доступ разрешен, 1 - доступ не разрешен.

int chmod(const char *path, int amode); - изменить права доступа (amode):

S_IWRITE - запись, S_IREAD - чтение, S_IWRITE | S_IREAD -запись и чтение.

Необходимо подключить sys\stat.h. Возврат при ошибке: 1.

Размер файла

Прототипы функций в io.h.

long filelength (int handle); - функция возвращает длину в байтах файла с дескриптором handle. Возврат при ошибке: -1.

int chsize(int handle, long size); - функция расширяет (дозапись '\0') или сужает (обрезает с конца) файл с дескриптором handle до длины size. Возврат при ошибке: -1.

Действия над файлом

Прототипы функций описаны в stdio.h.

int remove(const char *c); - функция удаляет файл с заданным именем.

Возврат при ошибке: -1.

int unlink(const char *path); - функция удаляет файл с заданным именем, прототип и в io.h. Возврат при ошибке: -1.

int rename(const char *oldname, const char *newname);

Функция переименовывает файл или каталог или перемещает файл. Имя включает путь, но диск текущий. Возврат при ошибке: не нуль.

Пример 1.

/* С помощью функции getcurdir формируется имя текущего ката лога включая и имя диска и имя корневого каталога */

#include <dir.h>

#include <stdio.h>

#include <string.h>

char *current_directory(char *path)

{

strcpy(path, "X:\\"); /* в строку path записывается X:\ */

path[0] = 'A' + getdisk(); /* замена X на текущее имя диска */

getcurdir(0, path+3); /* с четвертой позиции строки path записывается текущий каталог на текущем диске */

return(path);

}

int main(void)

{

char curdir[MAXPATH];

current_directory(curdir);

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

return 0;

}

/* Пример 2.

/* С помощью fnsplit поразбить имя на составляющие части. */

#include <stdio.h>

#include <dir.h>

int main(void)

{

char *s="\autoexec.bat";

char drive[MAXDRIVE];

char dir[MAXDIR];

char file[MAXFILE];

char ext[MAXEXT];

int flags;

/* flags указывает заданы ли все компоненты в строке s */

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);

return 0;

}

/* ЗАДАНИЕ

Вариант 1

Определить имена существующих дисков.

Вариант 2

Создать каталог внутри личного. Объявить его текущим. Переместить все файлы с расширением exe из личного каталога в созданный. Удалить файлы, запрашивая разрешение на удаление для каждого файла.

Вариант 3

Имя файла . Установить на каком диске, в каком каталоге записан файл. Создать файл (пустой) с таким же именем, но с расширением my в родительском каталоге.

Вариант 4

Из текущего каталога прочитать и выдать на дисплей файлы, предназначенные только для чтения и их размеры.

Вариант 5

Определить на каком диске существует каталог с именем , определить его размер, дату создания, объявить его текущим.

Вариант 6

У всех файлов в текущем каталоге с расширением exe изменить права доступа - разрешить только чтение. Попытаться удалить один из файлов.

Вариант 7

Создать каталог в корневом каталоге. Объявить его текущим, создать несколько пустых файлов (количество по запросу) с именами, созданных с помощью модификации имени file. Определить длину этих файлов.mktemp

Вариант 8

Найти самый длинный файл в каталоге (имя - по запросу).

Вариант 9

Создать каталог внутри личного. Переместить туда все файлы с расширением bak и выдать на дисплей информацию о них: время, дату создания, размер.

Вариант 10

Ввести с дисплея имя диска, каталога, файла и расширения. Создать указанный файл (пустой). Если каталог не существует -создать его. Исходные данные: С, \MMPP\PPUT, file5, mtm.

Соседние файлы в папке Лаб по С и С++