MS-DOS для программиста


Программа CLUSTLST - часть 2


BOOT far *boot_rec; int status; char *buf;

char drive[128], dir[128]; char fname[20], ext[10]; char name[12];

printf("Информация об открытых файлах DOS, " "Frolov A., (C) 1995\n");

// Открываем файл, для которого будем // получать список кластеров handle = open(argv[1], O_BINARY ); if(handle == 0) { printf("Ошибка при открытии файла\n"); return(-1); }

// Разбиваем путь к файлу на компоненты: // - диск; // - каталог; // - имя файла; // - расширение имени _splitpath(argv[1], drive, dir, fname, ext);

if(drive[0] == '\0' dir[0] == '\0' argc < 2) { printf("\nУкажите полный путь к файлу\n"); return(-1); }

printf("Исследуем расположение файла '%s'", argv[1]);

// Комбинируем строку из имени и расширения strcpy(name, fname); for(i = 0; i < 8; i++) { if(name[i] == 0) break; } for(; i < 8; i++) name[i] = ' '; name[8] = 0;

strcat(name, &ext[1]); for(i = 8; i < 12; i++) { if(name[i] == 0) break; } for(; i < 12; i++) name[i] = ' '; name[12] = 0;

// Преобразуем строку имени в заглавные буквы strupr(name);

// Вычисляем номер диска drive[0] = toupper(drive[0]); disk = drive[0] - 'A';

// Получаем адрес векторной таблицы связи regs.h.ah = 0x52; intdosx(&regs, &regs, &sregs);

// Передвигаем указатель на поле msb_seg cvt = (LPCVT)MK_FP(sregs.es, regs.x.bx - 2);

// Адрес начала таблицы файлов sft = get_fsft(cvt);

// Сбрасываем флаг поиска файла flag = 0;

for(;;) { // Конец таблицы файлов if(sft == (SFT far *)NULL) break; i = sft->file_count;

for(j=0;j<i;j++) { dfcb = (&(sft->dfcb)) + j;

// Ищем файл в таблице открытых файлов k = _fmemcmp((const void far*)name, (const void far*)dfcb->filename, 11); if(k == 0) { printf("\nDFCB файла: " " %Fp", dfcb);

// Запоминаем адрес таблицы // для найденного файла file_dfcb = dfcb;

// Показываем содержимое таблицы show(file_dfcb); flag = 1; break; } } if(flag == 1) break;

sft = get_nsft(sft); }

if(flag == 0) { printf("Файл не найден"); close (handle); return(-1); }




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



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