Будь умным!


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

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

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


Вариант №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. Регулирование аудиторской деятельности
3. Школа управлінської майстерності для лідерів учнівського самоврядування
4. Сибирский федеральный университет УТВЕРЖДАЮ Директор института -Г.
5. 05 06.05 07.06 1 день 12
6. Курсовая работа- Психологические причины суицидального поведения у подростков
7. Курсовая работа- Получение витамина С из шиповника
8. торговая деятельность это деятельность связанная с извлечением торговой прибыли включая и производство1
9. Учебное пособие- Класне самоврядування як одна із форм виховної роботи
10. вложение капитала ради получения прибыли и или иного полезного эффекта.
11. Рыжая вечерница (nyctlus noctul)
12. Здравствуйте хозяева дорогие Гостей не ждали Ответ хозяев
13. Права участников общества с ограниченной ответственностью
14. І Службовоінформаційні документи служби пожежнорятувального підрозділу 1 Керівн
15. УКРАЇНСЬКА МОВА ТА ЛІТЕРАТУРА ФОНЕТИКА 1
16. да и нет или почему идеи которые отвергли в крупной компании могут положить начало вашему бизнесу Ис1
17. Кузбасспригород
18. Закружился хоровод Льются песни звонко.html
19. Заболел четыре дня назад после перенесенной катаральной ангины
20. БРЯНСКАЯ ГОСУДАРСТВЕННАЯ СЕЛЬСКОХОЗЯЙСТВЕННАЯ АКАДЕМИЯ Факультет энергетики и природопользования