Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
/* ЛАБОРАТОРНАЯ РАБОТА 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.