Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Вариант №19.
Задание к курсовому проекту:
Разработать для Linux программу, которая после запуска отображает содержимое текущего каталога файлов с выдачей имен и расширений файлов, даты создания и размера файлов. Отображение должно выполняться в консольном окне, занимая выделенный прямоугольник шириной 40 символов, далее называемый панелью. Эту панелью следует выделить цветом, выбранным разработчиком, но отличным от черного. Одна из строк панели должна перемещаться вниз и вверх с помощью нажатия клавиш “стрелки вниз” и “стрелки вверх”. Когда текущая строка соответствует каталогу, то нажатие на клавишу Enter приводит к переходу. В соответствующий каталог и отображению его содержимого. Предусмотреть выход из программы путем нажатия клавиши Esc или F10.
Исходный текст программы:
#include<termios.h>
#include<string.h>
#include<stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<dirent.h>
#include<unistd.h>
int quantity_file; //Переменная счета файлов в каталоге
int regular_directory; //Переменная определения типа ссылки
off_t size; //Переменная определения размера ссылки
char time_s[40]; //Переменная определения времени ссылки
char *sfile; //Ссылка на вход в каталог
char *dir_name; //Имя каталога
void ramk(int x1,int y1,int x2,int y2) //Процедура рамки с вводом координат
{
int x,y;
int fon=44,sim=0;
char nameramk[]=" Имя";
char sizeramk[]="Размер";
char dateramk[]="Время правки";
for(x=x1+1;x<=x2-1;x++)printf("\033[1;%d;%dm\033[%d;%dH─",sim,fon,y1,x);
for(x=x1+1;x<=x2-1;x++)printf("\033[1;%d;%dm\033[%d;%dH─",sim,fon,y2,x);
for(y=y1+1;y<=y2-1;y++)printf("\033[1;%d;%dm\033[%d;%dH│",sim,fon,y,x1);
for(y=y1+1;y<=y2-1;y++)printf("\033[1;%d;%dm\033[%d;%dH│",sim,fon,y,x2);
printf("\033[1;33;%dm\033[%d;%dH %-16s %-7s %-12s",fon,y1+1,x1+1,nameramk,sizeramk,dateramk);
printf("\033[1;%d;%dm\033[%d;%dH├",sim,fon,y2-2,x1);
printf("\033[1;%d;%dm\033[%d;%dH┤",sim,fon,y2-2,x2);
for(x=x1+1;x<=x2-1;x++)printf("\033[1;%d;%dm\033[%d;%dH─",sim,fon,y2-2,x);
printf("\033[1;%d;%dm\033[%d;%dH┬",sim,fon,y1,x1+26);
for(y=y1+1;y<=y2-2;y++)printf("\033[1;%d;%dm\033[%d;%dH│",sim,fon,y,x1+26);
printf("\033[1;%d;%dm\033[%d;%dH┴",sim,fon,y2-2,x1+26);
printf("\033[1;%d;%dm\033[%d;%dH┬",sim,fon,y1,x1+17);
for(y=y1+1;y<=y2-2;y++)printf("\033[1;%d;%dm\033[%d;%dH│",sim,fon,y,x1+17);
printf("\033[1;%d;%dm\033[%d;%dH┴",sim,fon,y2-2,x1+17);
printf("\033[1;%d;%dm\033[%d;%dH┌",sim,fon,y1,x1);
printf("\033[1;%d;%dm\033[%d;%dH└",sim,fon,y2,x1);
printf("\033[1;%d;%dm\033[%d;%dH┐",sim,fon,y1,x2);
printf("\033[1;%d;%dm\033[%d;%dH┘",sim,fon,y2,x2);
printf("\033[0m");
}
char *read_file(char *filename) //Процедура определения ссылки
{
int fd;
struct stat file_info;
struct tm *htm;
fd=open(filename,O_RDONLY,0644);
if(fd==-1)
{
regular_directory=2;
size=0;
}
fstat(fd,&file_info); //Информация о файле
size=file_info.st_size; //Присваивание размера к гл. переменной
/*----Перевод в строковое значение времени правки ----*/
htm=localtime(&file_info.st_ctime);
strftime(time_s,sizeof(time_s),"%m-%d %H:%M",htm);
if(S_ISREG(file_info.st_mode)) //Определение файла
{
close(fd);
regular_directory=0;
return NULL;
}
if(S_ISDIR(file_info.st_mode)) //Определение каталога
{
close(fd);
regular_directory=1;
size=4096;
return NULL;
}
}
/*Процедура вывода файлов в директории с вводом координат и вводом имени каталога
и позиции курсора*/
char *directory(int x,int y,int h,int cursor,char *namedir)
{
DIR *dir;
struct dirent *Dir;
char *name_file;
char file_buff[100];
char dir_buff[100];
char file_visible[17];
int schet=0,
i=16;
int stop_y=y;
int len;
int probel,stopprobel=y+i+1,xprobel;
int bold=1,
background=44,
foreground=0;
printf("\033[2J");
x++;y++;
dir=opendir(namedir); //Открытие каталога
cursor+=y;
quantity_file=0;
/*--------Чтение каталога---------*/
while((Dir=readdir(dir))!=NULL)
{
quantity_file++;
schet++;
if((schet>=h+1)&&(schet<=h+i))
{
y++;
strncpy(dir_buff,namedir,sizeof(dir_buff)); //Формирование пути
strncpy(file_buff,Dir->d_name,sizeof(file_buff)); //файлов
strcat(dir_buff,"/");
strcat(dir_buff,file_buff);
len=strlen(dir_buff);
dir_buff[len+1]='\0';
read_file(dir_buff); //Проверка различия между каталогом и файлом
if(regular_directory==1)foreground=37; //Обозначение цветами
if(regular_directory==0)foreground=0;
if(regular_directory==2)foreground=35;
if(cursor==y) //Определение позиции курсора
{
sfile=Dir->d_name; //Присваивание имени к гл. перем.
background=47; //Выделение курсора
foreground=30;
bold=0;
printf("\033[0;44m\033[%d;%dH%-39s",stop_y+i+3,x,sfile);
}
else { background=44;bold=1; }
strncpy(file_visible,file_buff,sizeof(file_visible));
printf("\033[%d;%d;%dm\033[%d;%dH%-17s %6d %12s",bold,foreground,background,y,x,file_visible,size,time_s);
}
}
for(probel=y+1;probel<=stopprobel;probel++)
for(xprobel=x;xprobel<40;xprobel++)
printf("\033[44m\033[%d;%dH ",probel,xprobel);
ramk(1,2,40,22);
printf("\033[0m");
closedir(dir);
}
char *plus_buff(char *buff1,char *buff2) //Процедура склеивания символьных //указателей
{
char buff_dir[100];
char buff_fil[100];
char str_file[100];
int lenght,len,len_fil,len_dir;
int stop=0;
strncpy(buff_dir,buff1,sizeof(buff_dir));
strncpy(buff_fil,buff2,sizeof(buff_fil));
len_fil=strlen(buff_fil);
/*Определение двух точек */
if((buff_fil[len_fil-1]=='.')&&(buff_fil[len_fil-2]=='.')) //Возврат в родительский каталог
{
len_dir=strlen(buff_dir);
while(buff_dir[len_dir]!='/') //Вырез текущего каталога
{
len_dir--;
if(buff_dir[len_dir]!='/')
{
buff_dir[len_dir]='\0';
}
proba=len_dir;
}
if(len_dir>2)
if(buff_dir[len_dir]=='/')
{
buff_dir[len_dir]='\0';
}
dir_name=(char*)malloc(len_dir); //Присваивание к гл. перем. имени каталога
strcpy(dir_name,buff_dir);
return NULL;
}
if((buff_fil[len_fil-1]!='.')&&(buff_fil[len_fil-2]!='.')) //Формирование пути каталога
{
lenght=strlen(buff_dir);
if(buff_dir[lenght-1]!='/')
{
strcat(buff_dir,"/");
buff_dir[lenght+1]=='\0';
}
strncat(buff_dir,buff_fil,sizeof(buff_dir));
strncpy(str_file,buff_dir,sizeof(str_file));
read_file(str_file); //Проверка различия между каталогом и файлом
if(regular_directory==0) //Оставлять прежний путь если файл
{
strncpy(buff_dir,buff1,sizeof(buff_dir));
strncpy(str_file,buff_dir,sizeof(str_file));
len=strlen(str_file);
str_file[len]='\0';
dir_name=(char*)malloc(len);
strcpy(dir_name,str_file);
return NULL;
}
if(regular_directory==1) //Если каталог формировать путь
{
len=strlen(str_file);
str_file[len]='\0';
dir_name=(char*)malloc(len);
strcpy(dir_name,str_file);
return NULL;
} }
}
int main()
{
struct termios sterm,nterm;
unsigned int htty;
int k;
int hn=1,
cr=1;
int len;
char c;
char *namedir;
namedir="/";
dir_name=namedir;
htty=open("/dev/tty",O_RDONLY); //Открытия устройства
if(htty==-1){printf("Нет доступа к устройству \n");exit(1);}
/*Обработка клавиш в устройстве */
tcgetattr(htty,&sterm);
tcgetattr(htty,&nterm);
nterm.c_lflag &=~(ICANON|ECHO);
nterm.c_cc[VMIN]=1;
nterm.c_cc[VTIME]=0;
tcsetattr(htty,TCSAFLUSH,&nterm);
k=0;
printf("\033[2J");
while((k!=5))
{
directory(1,2,hn,cr,namedir);
printf("\033[1;1HDirectory Way: %s",dir_name); //Ввод пути директории
printf("\033[23;1HKey Up - Up|Key Down - Down|Enter ");
c=getchar();
if(c==10)
{
plus_buff(namedir,sfile); //Запуск процедуры склеивания указателей
namedir=dir_name;
cr=1;
hn=1;
}
if((c==27)&&(k==0))k=1; //Ввод клавиш
if((c==91)&&(k==1))k=2;
if((c==65)&&(k==2)) //Клавиша верх
{
cr--;
k=0;
}
if((c==66)&&(k==2)) //Клавиша Вниз
{
cr++;
k=0;
}
if((c==50)&&(k==2))k=3; //Клавиша Выхода F10
if((c==49)&&(k==3))k=4;
if((c==126)&&(k==4))
{
k=5;
}
if(cr<1) //Ограничение координат курсора верхней точки
{
hn--;
cr++;
}
if(cr>16) //Ограничение координат курсора нижней точки
{
hn++;
cr=16;
}
if(hn<1) //Ограничение скроллинга
{
hn++;
}
if(quantity_file-1<cr)
cr--;
if(quantity_file>16)
if(hn>quantity_file-16)
{
hn--;
}
}
printf("\033[25;1H");
tcsetattr(htty,TCSAFLUSH,&sterm);
close(htty);
}
Список использованной литературы: