Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

Задание к курсовому проекту- Разработать для Linux программу которая после запуска отображает содержимое те

Работа добавлена на сайт samzan.net:

Поможем написать учебную работу

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

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

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 24.11.2024

Вариант №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);

}


Список использованной литературы:

  •  А. Н. Флоренсов “Системное программирование в многозадачных ОС. Семантический подход”. Издательство “ОмГТУ”. Омск 2000 г.

  •  Марк Митчелл, Джеффри Оулдем “Программирование для Linux. Профессиональный подход“. Издательство “Вильямс”. Москва 2002 г.




1. Методологические основы эфиродинамики Наука задача которой сост
2. модуль Vот t 1 Рис
3. і В чому полягає відмінність економічної діагностики підприємства від його економічного аналізу г всі в
4. Взаимодействия белков с РНК структурный компьютерный анализ
5.  Историческая действительность и дух города породившие героя и язык эпохи
6. Шимпанзе в храме языка
7. Компоненты для построения отчетов2 2
8. Реферат- Двойное гражданство
9. КОРЭ; Кравцова Л
10. Рыбные ресурсы их использование и охрана
11. Нефтедолларов наше руководство впервые отчетливо ощутило во время энергетического кризиса 1973 г
12. на тему- КУЛЬТУРНА ПОЛІТИКА УКРАЇНИ- КОРОТКИЙ ІСТОРИЧНИЙ ОГЛЯД ТА ОЦІНКИ Зміст роботи 1
13.  Классификация опасных и вредных производственных факторов и принципы их нормирования
14.  Гармонические четверки точек и их связь с полными четырехвершинниками
15. а; на местном уровне ~ аместители руководителей центральных больничных амбулаторнополиклинических орг
16. реферат дисертації на здобуття наукового ступеня кандидата філологічних наук Київ ~
17. тема управления это совокупность субъекта управления и объекта управления которые находятся в определенно
18. Реферат на тему- ПРИЙОМИ І ПРАВИЛА СТРІЛЬБИ З МАЛОКАЛІБЕРНОЇ ГВИНТІВКИ Безпека під час проведення стріл
19. ТЕМАТИЧНЕ МОДЕЛЮВАННЯ НЕЛІНІЙНИХ ЗБУРЕНЬ ПРОЦЕСІВ ТИПУ ldquo;ФІЛЬТРАЦІЯКОНВЕКЦІЯДИФУЗІЯrdquo; З ПІСЛЯДІЄЮ
20. Литература - Терапия лекции по кардиологии