Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Функциональные клавиши.docx
Скачиваний:
8
Добавлен:
11.04.2015
Размер:
785.39 Кб
Скачать

Intmakedir(char*path);

Данная функция создает новый каталог. При ее вызове появляется окно со строкой ввода имени нового каталога. При удачном завершении создается новый каталог, иначе выводится окно с ошибкой.

Параметры функции: char* path – путь к каталогу;

Используемые библиотеки: <curses.h><dirent.h><stdlib.h><string.h>

<sys/dir.h><sys/stat.h><unistd.h><errno.h>

Тип возвращаемого значения- целое число.

Возвращаемое значение при ошибке -1.

Схема алгоритма

Функция создания нового каталога

int makedir (char *path)

{

mode_t oldmask=umask(0);

mode_t maskdir=0777-oldmask;

WINDOW *w;

const char* namewin="Great direcory";

char *namedir;

namedir=(char*)malloc(PATH_MAX);

w = newwin( WLINES, WCOLS, Wy+1, Wx+1);

keypad( w, TRUE );

int kursor;

wrefresh(w);

wattrset(w,COLOR_PAIR(10));

werase(w);

box(w,0,0);

wmove(w,0,(WCOLS-strlen(namewin))/2);

wattrset(w,COLOR_PAIR(12));

wprintw( w, " %s ",namewin);

wattrset(w,COLOR_PAIR(10));

for (int i=1;i<=WCOLS-2;i++)

for (int j=1;j<=WLINES-2;j++)

{

mvwaddstr(w,j,i," ");

}

mvwaddstr(w,WLINES/2-2,(WCOLS-38)/2,"Input name directory and press 'ENTER'");

mvwaddstr(w,WLINES/2+2,(WCOLS-8)/2, "OK");

mvwaddstr(w,WLINES/2+2,(WCOLS+1)/2, "CANCEL");

wattrset(w,COLOR_PAIR(10));

for (int i=3;i<=WCOLS-4;i++)

{

mvwaddstr(w,WLINES/2,i," ");

}

wmove(w,WLINES/2,3);

echo();

curs_set(1);

wgetstr(w,namedir);

noecho();

curs_set(0);

kursor=0;

while (1)

{

wrefresh(w);//отобразить stdscr

if (kursor==0)

{

wattrset(w,BLACK_CYAN);

mvwaddstr(w,WLINES/2+2,(WCOLS+1)/2, "CANCEL");

wattrset(w,A_BOLD|A_UNDERLINE|YELLOW_CYAN);

mvwaddstr(w,WLINES/2+2,(WCOLS-8)/2, "OK");

}

else

{

wattrset(w,COLOR_PAIR(12));

mvwaddstr(w,WLINES/2+2,(WCOLS-8)/2, "OK");

wattrset(w,A_BOLD|A_UNDERLINE|YELLOW_CYAN);

mvwaddstr(w,WLINES/2+2,(WCOLS+1)/2, "CANCEL");

}

wrefresh(w);

switch (wgetch(w))

{

case KEY_RIGHT:

case KEY_LEFT:

case KEY_TAB: if (kursor==0) kursor=1; else kursor=0; break;

case KEY_ESC: kursor=1; goto out;

case 10: goto out; }

}

out:

delwin(w);

if (kursor==1) goto cansel;

errno=0;

if (mkdir(getfullname(path,namedir),maskdir)!=0)

{ printerror(strerror(errno));

return -1;}

cansel:

(void) umask(oldmask);

return 0;}

Функция копирования:

Int fcopy (char* path, struct dirent **list, int poskurs, char* othpath);

Данная функция копирует файл или файлы, находящиеся в каталоге. При ее вызове появляется окно со строкой ввода имени нового каталога или файла. При удачном завершении файл появляется в соседней панели, при копировании каталога, в соседней панели появляется новый каталог с вложенными в него файлами, иначе выводится окно с ошибкой.

Параметры функции:

char* path – путь к текущему каталогу;

struct dirent **namelist – структура с именами всех файлов каталога;

Int positionkurs – положение курсора в списке файлов.

char* othpath – новый путь.

Используемые библиотеки: аналогично используемым в предыдущей функции и подключается еще <fcntl.h>

Тип возвращаемого значения- целое число.

Возвращаемое значение при ошибке -1.

Схема алгоритма:

Функция копирования:

int fcopy (char* path, struct dirent **list, int poskurs, char* othpath)

{

WINDOW *w;

FILE *file1, *file2;

char* str;

DIR *d;

mode_t filemod;

struct stat inf;

struct dirent *readc;

int f1,f2,r;

str=(char*)malloc(PATH_MAX);

w = newwin( WLINES, WCOLS, Wy+1, Wx+1);

char* copyname;

copyname=(char*)malloc(PATH_MAX);

char* newpath;

newpath=(char*)malloc(PATH_MAX);

char* buf[BUFSIZ];

copyname=list[poskurs]->d_name;

noecho();

curs_set(0);

wrefresh(w);

wattrset(w,COLOR_PAIR(10));

werase(w);

box(w,0,0);

wmove(w,0,(WCOLS-8)/2+3);

wattrset(w,COLOR_PAIR(10));

wprintw( w, "Copy File" );

wattrset(w,COLOR_PAIR(10));

for (int i=1;i<=WCOLS-2;i++)

for (int j=1;j<=WLINES-2;j++)

{

mvwaddstr(w,j,i," ");

}

wattrset (w, COLOR_PAIR(12));

for (int i=4;i<=WCOLS-6;i++) mvwaddstr(w, WLINES/2, i, " ");

wrefresh(w);

wattrset(w, COLOR_PAIR(10));

mvwaddstr(w,WLINES/2-2,(WCOLS-2)/2-3, "Enter a new name");

wattrset(w,COLOR_PAIR(10));

mvwaddstr(w,WLINES/2+2,(WCOLS-2)/2, "OK");

wrefresh(w);

echo(); wattrset(w, COLOR_PAIR(12));

wmove(w, WLINES/2,4);

keypad( w, TRUE );

wgetstr(w, str);

noecho();

strcpy(newpath,othpath);

strcat(newpath, "/");

strcat(newpath, str);

stat(getfullname(path,list[poskurs]->d_name), &inf);

filemod=inf.st_mode;

if (S_ISDIR(inf.st_mode))

{ if ((mkdir(newpath,filemod))<0) {

printerror ( "Unable to create such folder");

goto out; }

char* dir=getfullname(path,list[poskurs]->d_name);

d=opendir(dir);

while ((readc=readdir(d))!=NULL)

{

if (!strcmp(readc->d_name,"..") || !strcmp(readc->d_name,".")) continue;

f1=open(getfullname(dir,readc->d_name), O_RDONLY, filemod);

strcpy(copyname,newpath);

strcat(copyname,"/");

strcat(copyname,readc->d_name);

if ((f2=open(copyname, O_CREAT | O_WRONLY, filemod))<0) {

printerror ("Unable to create such file");

goto out; }

while(r=read(f1,buf,sizeof(buf)))

write(f2,buf,r);

close(f1);

close(f2);

}

closedir(d);

}

else

{

f1=open(getfullname(path,list[poskurs]->d_name), O_RDONLY, filemod);

f2=open(newpath, O_CREAT | O_WRONLY, filemod);

while(r=read(f1,buf,sizeof(buf)))

write(f2,buf,r);

close(f1);

close(f2);}

out: delwin(w);

refresh();

}

Функция удаления:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]