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

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

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

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

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

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

от 25%

Подписываем

договор

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

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

Вариант №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. 30 11
5. Ислама Ибн Теймии да смилуется Аллах над нами и над этими двумя Алимами и я нашел два момента где Шейх огова
6. Это послание направлено к объективно и справедливо мыслящим людям из числа тех кто поддался соблазну вы
7. Subjectus лежащий внизу находящийся в фундаментальныя категория философии
8. Радиомоделисты; 12
9. на тему- Договір купівліпродажу як підстава виникнення права власності на нерухомість
10. это биополимеры сложного строения макромолекулы протеины которых состоят из остатков аминокислот соед