Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: как узнать размер кластера fat системы
Форум программистов > Системное программирование > Другие
dag
Есть простецкое задание, надо сосчитать размер потеряного дискового пространства которое находится в последнем (полностью не заполненном) кластере файла...

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

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

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

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

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

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

за ранее благодарю!
Barmutik
Использовать функцию GetDiskFreeSpace
dag
Цитата(Barmutik @ 24:03:2005, 13:05 )
Использовать функцию GetDiskFreeSpace

неполучится к сожалению... надо именно использовать только простые функции и turbo paskal 7.0 sad.gif
Barmutik
Попробуйте это...

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

Кому интересно, моглу выслать коды со всеми структурами и функциями чтения.
Email : "rytov_a@mail.ru"
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2008 IPS, Inc.