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




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


if(isdir(dd[i].attrib)){ /* себя и родителя проигнорировать */ if( eq(basename, "." ) eq(basename, "..")) continue; level++; /* У каталогов почему-то size == 0 */ enterDir( basename, INT(dd[i].firstCluster), need_to_get); level--; } else if( islabel(dd[i].attrib)){ printf( "Volume label:%11.11s\n", dd[i].name ); } else if( need_to_get ) getFile ( basename, INT(dd[i].firstCluster), size); } /* line('#'); */ }

/* Прочесть файл в UNIX-ную файловую систему */ void getFile(name, clu, size) char *name; /* имя файла */ ushort clu; /* начальный кластер */ long size; /* размер */ { FILE *fp; /* файл куда сохранять */ struct stat st; ushort nclu = 0;/* порядковый номер кластера */

sprintf(newname, "%s%s/%s", root, cwd, name );

if( ask && stat(newname, &st) >= 0 ){ char answer[30]; fprintf(stderr, "%s уже существует, перезаписать? ", newname); gets(answer); if( *answer != 'y' ) return; fprintf( stderr, "\tOK\n" ); } if((fp = fmdopen( newname, "w" )) == NULL){ printf( "Не могу создать %s\n", newname ); return; } if( trace ) fprintf( mapfp, "\n%s/%s:", cwd, name );

while( clu ){ if( trace ) traceclu(nclu++, clu); size -= getCluster(clu, fp, size, cluster); clu = nextCluster(clu); } fclose(fp); }

/* Обработать подкаталог */ void enterDir(name, clu, create) char *name; /* имя */ ushort clu; /* начальный кластер */ { char *tail, *myCluster; struct dir *dsub; ushort nclu; int nentries; /* число записей в каталоге */

/* Коррекция cwd */ tail = cwd + strlen(cwd); *tail = '/'; strcpy(tail+1, name);

if( create ){ /* создать */ sprintf( newname, "%s%s", root, cwd ); mkdir ( newname, 0755); } if( trace ) fprintf( mapfp, "\nDIR %s:", cwd);

myCluster = Malloc( sizeof cluster ); dsub = (struct dir *) myCluster;

nentries = nclu = 0; while( clu ){ if( trace ) traceclu(nclu++, clu); /* Прочесть очередной кластер каталога */ getCluster(clu, NULL,(long) CLU, myCluster); /* Обработать имена в этом кластере */ doDirectory(nentries, ENTRperCLUSTER, dsub); nentries += ENTRperCLUSTER; /* Взять следующий кластер */ clu = nextCluster(clu); } *tail = '\0'; free(myCluster); }




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