Операционная система MS DOS (том 2)


Файлы и каталоги - часть 10


}

// Получаем буфер для чтения кластеров каталога

clust_buffer = _fmalloc(boot_rec->bpb.clustsize * boot_rec->bpb.sectsize);

printf("\nНомер первого кластера каталога:"); gets(cbuf); cur_clust = atoi(cbuf);

// Переменная k используется в качестве флага. // При первом просмотре каталога ее значение равно 0, // затем эта переменная устанавливается в 1.

k=0;

for(;;) {

// Сохраняем номер кластера каталога

j=cur_clust;

// Вычисляем номер следующего кластера, распределенного // каталогу

cur_clust = fat(fat_buffer, ffat, cur_clust); printf("%d ",cur_clust);

// Читаем кластер в буфер clust_buffer

reg.x.ax = drive; reg.x.bx = FP_OFF(clust_buffer); segreg.ds = FP_SEG(clust_buffer); reg.x.cx = boot_rec->bpb.clustsize; reg.x.dx = root_begin + root_sectors + ((j-2)*boot_rec->bpb.clustsize); int86x(0x25, &reg, &reg, &segreg); _asm pop ax

// Показываем содержимое каталога

rptr = (FITEM _far *)clust_buffer;

// Первый дескриптор в каталоге указывает на // этот же каталог. В поле имени первого дескриптора // находится строка ". ". Этот факт можно использовать // для проверки каталога. Если вы по ошибке указали // номер кластера, не принадлежащего каталогу, // программа завершит работу с сообщением об ошибке.

if(k == 0) { k=1; if(strncmp(rptr->name,". ",8) != 0) { printf("\nЭто не каталог !"); exit(-1); } }

printf("\n" "\nИмя файла Аттр. Дата Время Кластер Размер" "\n------------ ----- ---------- -------- ------- ------");

for(;;rptr++) { printf("\n");

// Признак конца каталога - нулевой байт в начале // имени файла

if(rptr->name[0] == 0) break;

// Выводим содержимое дескриптора файла

for(i=0; i<8; i++) printf("%c",rptr->name[i]); printf("."); for(i=0; i<3; i++) printf("%c",rptr->ext[i]); printf(" %02X %02d-%02d-%02d %02d:%02d:%02d ", rptr->attr, rptr->date.day, rptr->date.month, rptr->date.year + 1980, rptr->time.hour, rptr->time.min, rptr->time.sec * 2); printf(" %-5d %lu", rptr->cluster_nu, rptr->size);




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