- •Оглавление
- •Введение:
- •Задание:
- •Функциональные клавиши:
- •Используемые системные вызовы и библиотечные функции:
- •Порядок создания библиотеки
- •Directory.H
- •Drawlib.H
- •Описание собственных функций
- •Cхема алгоритма
- •Intmakedir(char*path);
- •Int fcopy (char* path, struct dirent **list, int poskurs, char* othpath);
- •Int positionkurs – положение курсора в списке файлов.
- •Int remdf(char*path);
- •Int cutf(char*path, char*pathD);
- •Void name(char nn[33]);
- •Voidaccesscheck();
- •Voidaccessdev();
- •Void printerror(const char* text);
- •Void printerror(const char* text)
- •Порядок создания собственных библиотек :
- •Результат работы программы
- •Список литературы
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();
}
Функция удаления: