как узнать размер кластера fat системы

  • Автор темы dag
  • Дата начала
Статус
Закрыто для дальнейших ответов.
D

dag

Гость
#1
Есть простецкое задание, надо сосчитать размер потеряного дискового пространства которое находится в последнем (полностью не заполненном) кластере файла...

сделать просто - рекурсией шарим по диску находя все файлы, делим размер файла на размер кластера, полученное значение округляем всегда в большую сторону, умножаем на размер кластера и вычитаем размер файла, добавляем к общей переменной результата........

в общем фигня.

теперь вопрос: как узнать размер кластера (ну или там блока, сектора, etc короче).

если можно как-то это спросить у доса, кинте плиз номер прерывания...

может где в примераз описано...

в общем приветствуется всякая инфа...

за ранее благодарю!
 
D

dag

Гость
#3
<!--QuoteBegin-Barmutik+24:03:2005, 13:05 -->
<span class="vbquote">(Barmutik @ 24:03:2005, 13:05 )</span><!--QuoteEBegin-->Использовать функцию GetDiskFreeSpace[/quote]
неполучится к сожалению... надо именно использовать только простые функции и turbo paskal 7.0 ;)
 
B

Barmutik

Гость
#4
Попробуйте это...

Код:
TYPE
PDiskInfo = ^TDiskInfo;
TDiskInfo = RECORD
 SectorsPerCluster: BYTE;
 BytesPerSector,
 ClustersPerDisk: WORD;
 MediaDescriptor: BYTE;
END;

PROCEDURE DiskInfo(Drive: Char; Data: PDiskInfo);
{ Returns cluster/sector and media descriptor information of specified drive }
ASM PUSH DS     { Function alters DS register }
 MOV  AH,$1C   { Get File Allocation Table Info }
 MOV  DL,Drive  { get drive letter }
 OR  DL,$20   { Convert Drive letter to lower case }
 SUB  DL,$60   { Convert drive letter to drive number }
{$IFDEF MSDOS}
 INT  $21
{$ENDIF}
{$IFDEF WINDOWS}
 CALL DOS3Call
{$ENDIF}
 LES  DI,Data  { Load pointer to TDiskInfo structure }
 STOSb      { save Sectors/cluster }
 MOV  AX,CX
 STOSw      { save bytes/sector }
 MOV  AX,DX
 STOSw      { save number of clusters }
 MOV  SI,BX   { load media descriptor offset }
 LODSb      { load media descriptor }
 STOSb      { save media descriptor }
 POP  DS
END; { DiskInfo }
 
A

-Alexx-

Гость
#5
Прочитать BOOT-сектор логического диска (самый первый), а там лежит много полезной FAT информации, в том числе и размер кластера. Читать можно Си-шной biosdisk, но она работает только с винтами не более 2 гектар.
Решение: нужно вызвать 13-ое расширенное прерывание (кажись 42-у функцию: AX=4200h), передав в качестве параметра дисковый пакет определенной структуры.
Работает только в DOS и Win9x. Не помашает проверка на поддержку расширения этого прерывания.

Кому интересно, моглу выслать коды со всеми структурами и функциями чтения.
Email : "rytov_a@mail.ru"
 
Статус
Закрыто для дальнейших ответов.