- •Лабораторная работа №5
- •Теоретические сведения
- •Функция поиска файла или каталога на диске findfirst
- •Функция продолжения поиска файла findnext
- •Пример использования функций findfirst и findnext.
- •Строка аргументов
- •Примеры программирования
- •Текст программы.
- •Пояснения к программе.
- •Текст программы.
- •Пояснения к программе.
- •Контрольные вопросы.
- •Лабораторное задание
- •Порядок выполнения лабораторной работы
- •Основные функции работы с каталогами файловой системы
- •Варианты заданий.
Пояснения к программе.
Вся информация о найденных файлах заносится в одно-связанный список, который в последствии сортируется и выводится на экран.
Структура DIR содержит описание информации о файле.
Структура list - это описание элемента одно-связанного списка.
Переменные pntr и p - это рабочие переменные, типа указатель на элемент списка.
Переменная min - это адрес элемента с информацией о файле с самой ранней датой создания файла.
Переменная dir - это переменная типа структуры DIR. Через эту переменную происходит обмен информацией.
Сортировка одно-связанного списка происходит следующим образом. Просматриваем элементы списка от начала до конца. Весь список будет разделен на две части: отсортированную и не отсортированную. Определяем адрес элемента с ранней датой создания (min), как первый элемент в не отсортированной части. Указатель p - это адрес первого не отсортированного элемента списка. В не отсортированной части ищем элемент с ранней датой создания файла ( внутренний цикл ) и информацию найденного элемента записываем по адресу переменной p, а информацию по адресу p записываем на место найденного элемента min ( обмен через переменную dir ).
После завершения сортировки, выводим на печать содержимое информационной части односвязанного списка. Одновременно происходит удаление списка из памяти.
Пример 2.
Вывести на экран информацию о файлах, созданных в году, заданном в строке аргументов, в алфавитном порядке. Если год не задан, то взять текущий год .
Текст программы.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#include <string.h>
#include <dir.h>
void main(int argc,char *argv[])
{ struct DIR{
char name[13]; // имя файла
long size; // размер
int data; // дата создания файла
int time; // размер
};
struct list{
DIR inf; // информация о файле
list *next; // адрес следующего элемента
};
/* описание переменных */
list *Dir=NULL,*pntr,*p,*min;
DIR dir;
int god=1998;
ffblk ff;
char path[]="c:\\dos\\*.*";
/* формирование года */
if(argc>1) god=atoi(argv[1]);
god-=1980;
/* поиск файлов с формированием односвязанного списка */
a=findfirst(path,&ff,FA_DIREC &&FA_ARCH);
while(!a)
{ int year=((ff.ff_fdate & 0177000)>>9);
if(year==god)
{
pntr=new list;
strcpy(pntr->inf.name,ff.ff_name);
pntr->inf.size=ff.ff_fsize;
pntr->inf.data=ff.ff_fdate;
pntr->inf.time=ff.ff_ftime;
pntr->next=NULL;
if(Dir==NULL)Dir=pntr;
else p->next=pntr;
p=pntr;
}
a=findnext(&ff) ;
}
/* сортировка односвязанного списка в алфавитном порядке имен */
p=Dir;
while (p!=NULL)
{ pntr=p;
min=p;
while(pntr!=NULL)
{ if(strcmp(pntr->inf.name,min->inf.name)<0)min=pntr;
pntr=pntr->next;
}
dir=min->inf;
min->inf=p->inf;
p->inf=dir;
p=p->next;
}
/* вывод содержимого односвязанного списка на экран */
clrscr();
while(Dir!=NULL)
{ printf(" %-15s %ld %d %d %d\n",
Dir->inf.name,
Dir->inf.size,
Dir->inf.data & 037,
(Dir->inf.data & 0740)>>5,
(( Dir->inf.data &0177000)>>9)+1980);
p=Dir;
Dir=Dir->next;
delete p;
}
}