Хрестоматия по программированию на Си в Unix


Системные вызовы и взаимодействие с UNIX. Хрестоматия по программированию на Си в Unix - стр. 5


6.3.2. Более правильно, однако, пользоваться сисвызовом statvfs - статистика по виртуальной файловой системе. Рассмотрим его в следующем примере: копирование файла с проверкой на наличие свободного места.

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <stdarg.h>

#include <fcntl.h> /* O_RDONLY */ #include <sys/types.h>

#include <sys/stat.h>

#include <sys/statvfs.h>

#include <sys/param.h> /* MAXPATHLEN */

char *progname; /* имя программы */

void error(char *fmt, ...){ va_list args;

va_start(args, fmt); fprintf(stderr, "%s: ", progname); vfprintf(stderr, fmt, args); fputc('\n', stderr); va_end(args); }

int copyFile(char *to, char *from){ /* куда, откуда */ char newname[MAXPATHLEN+1]; char answer[20]; struct stat stf, stt; int fdin, fdout; int n, code = 0; char iobuf[64 * 1024]; char *dirname = NULL, *s;

if((fdin = open(from, O_RDONLY)) < 0){ error("Cannot read %s", from); return (-1); } fstat(fdin, &stf); if((stf.st_mode & S_IFMT) == S_IFDIR){ close(fdin); error("%s is a directory", from); return (-2); }

if(stat(to, &stt) >= 0){ /* Файл уже существует */

if((stt.st_mode & S_IFMT) == S_IFDIR){ /* И это каталог */

/* Выделить последнюю компоненту пути from */ if((s = strrchr(from, '/')) && s[1]) s++; else s = from;

dirname = to;

/* Целевой файл - файл в этом каталоге */ sprintf(newname, "%s/%s", to, s); to = newname;

if(stat(to, &stt) < 0) goto not_exist; }

if(stt.st_dev == stf.st_dev && stt.st_ino == stf.st_ino){ error("%s: cannot copy file to itself", from); return (-3); } switch(stt.st_mode & S_IFMT){ case S_IFBLK: case S_IFCHR: case S_IFIFO: break;

default: printf("%s already exists, overwrite ? ", to); fflush(stdout);

*answer = '\0'; gets(answer);

if(*answer != 'y'){ /* NO */ close(fdin); return (-4); } break; } }

not_exist: printf("COPY %s TO %s\n", from, to);




- Начало -  - Назад -  - Вперед -



Книжный магазин