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




Примеры. Хрестоматия по программированию на Си в Unix - стр. 3


case S_IFDIR: /* каталог переименовываем в каталог */ if( ! strcmp( ".", basename(src))){ printf( "impossible to move directory \".\"\n" ); return FAILED; } if( ! mlink( src, dst, typefrom, typeto )){ if( errno == EXDEV ) printf( "No cross device directory links\n" ); return FAILED; } break;

case ECANTSTAT: printf( "%s does not exist\n", src ); return FAILED; } return OK; /* okay */ } int docpmv( char *src, /* файл-источник */ char *dst, /* файл-получатель */ struct ftype typeto, /* тип файла-получателя */ int cp, /* 0 - переименование, 1 - копирование */ int *confirm /* запрашивать подтверждение на перезапись ? */ ){ struct ftype typefrom; /* тип источника */ char namebuf[BUFSIZ]; /* новое имя получателя (если надо) */

typefrom = filetype(src); if(typefrom.type == ECANTSTAT){ /* не существует */ printf("%s does not exist.\n", src); return FAILED; } if( typefrom.type != S_IFDIR && typeto.type == S_IFDIR ){ /* файл в каталоге dst */ sprintf(namebuf, "%s/%s", dst, basename(src)); typeto = filetype(dst = namebuf); } if(typefrom.dev == typeto.dev && typefrom.ino == typeto.ino){ /* Нельзя копировать файл сам в себя */ printf("%s and %s are identical.\n", src, dst); return OK; /* так как файл уже есть - считаем это удачей */ } /* если получатель уже существует, то * запросить подтверждение на перезапись */ if(*confirm && typeto.type == S_IFREG){ char answer[40]; printf("%s already exists. Overwrite (y/n/all) ? ", dst); fflush(stdout); switch( *gets(answer)){ case 'n': default: return OK; /* ничего не делать */ case 'y': break; case 'a': *confirm = NO; /* дальше - без запросов */ break; } } return cp ? docopy(src, dst, typefrom.type, typeto.type) : domove(src, dst, typefrom.type, typeto.type) ; } void main(int argc, char *argv[]) { char *cmd; int cp, i, err, confirm = YES; struct ftype typeto; /* тип файла-получателя */

if( argc < 3 ) { printf( "Usage: %s source... destination\n", argv[0] ); exit(1); /* ненулевой код возврата сигнализирует об ошибке */ } /* выделяем базовое имя программы. */ cmd = basename( argv[0] );

if ( !strcmp( cmd, CP )) cp = 1; else if( !strcmp( cmd, MV )) cp = 0; else{ printf( "%s - wrong program name.\n", cmd ); exit(2); } typeto = filetype( argv[argc-1] ); if(cp && typeto.type != S_IFDIR && typeto.type != S_IFBLK && typeto.type != S_IFCHR && argc > 3){ printf("Group of files can be copied " "to the directory or device only.\n"); exit(3); } if(!cp && typeto.type != S_IFDIR && argc > 3){ printf("Group of files can be moved " "to the directory only.\n"); exit(4); } for(err=0, i=1; i < argc-1; i++) err += ! docpmv(argv[i], argv[argc-1], typeto, cp, &confirm); exit(err); /* 0, если не было ошибок */ }

© Copyright А. Богатырев, 1992-95
Си в UNIX

| |




Содержание  Назад  Вперед