Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Как определить размер кластера?


Автор: GSV4 17.8.2006, 12:52
Народ!
Кто-нибудь в курсе, как на Delphi определить размер кластера конкретного диска?

Автор: Yanis 17.8.2006, 13:01
http://forum.vingrad.ru/index.php?showtopic=21411&view=findpost&p=260327
В этом модуле есть функция DF_GetClusterSize.

Добавлено @ 13:03 
А вообще это делается так:
Код
function GetClusterSize (const Drive : string) : Cardinal;
var
  SectorSize, ClusterSize, Tmp : DWORD;
begin
  Result := 0;
  if GetDiskFreeSpace(PChar(Drive), SectorSize, ClusterSize, Tmp, Tmp) then
    Result := SectorSize * ClusterSize;
end;

Автор: GSV4 18.8.2006, 16:30
Цитата

  if GetDiskFreeSpace(PChar(Drive), SectorSize, ClusterSize, Tmp, Tmp) then
    Result := SectorSize * ClusterSize;

В том-то и дело, что функция GetDiskFreeSpace дает неправильные размеры. Я ее пробовал вызывать на двух разных винчестерах (на обоих FAT32, Windows 98 SE):
Seagate Barracuda 80 Гб (диски 24 Гб + 51 Гб);
Maxtor 160 Гб (20 + 30 + 30 + 40 Гб).
Она мне везде дает:
SectorSize = 64, ClusterSize = 512, что в итоге дает 32 768 байт. Тогда как на самом деле на некоторых дисках размер кластера у меня = 16 384 (это FAR так показывает; да и экспериментально это подтверждается). 
Попробуй сам вызвать эту функцию. Думаю, что и у тебя будет то же самое.

Автор: Yanis 18.8.2006, 17:01
GSV4
А ты ремарки к функциям читаешь?

Автор: dumb 18.8.2006, 17:22
хм. странно что нет на виду нормальной функции для вычисления этих параметров. user posted image
нашел вот такое http://www.codeguru.com/Cpp/W-P/system/article.php/c2885/.

Автор: GSV4 22.8.2006, 08:57
Цитата

А ты ремарки к функциям читаешь? 

Читаю. Какую именно ты имеешь в виду?

Автор: GSV4 22.8.2006, 09:17
To dumb:
Спасибо за "зло"!

Автор: Yanis 22.8.2006, 09:24
GSV4
Цитата
Windows Me/98/95: For volumes that are greater than 2 GB, the GetDiskFreeSpace function may return misleading values. The function caps the values that are stored into *lpNumberOfFreeClusters and *lpTotalNumberOfClusters so as to never report volume sizes that are greater than 2 GB. On volumes that are less than 2 GB and that have more than 64 actual sectors per cluster, *lpSectorsPerCluster will be capped at 64 and the values that are stored into *lpSectorsPerCluster, *lpNumberOfFreeClusters, and *lpTotalNumberOfClusters will be incorrect. That is because the operating system adjusts the values so that computations with them yield the correct volume size with the capped *lpSectorsPerCluster.

Автор: GSV4 22.8.2006, 09:40
To Yanis:
А где ты ее взял? Лично я читаю файл "C:\Program Files\Common Files\Borland Shared\MSHelp\WIN32.HLP" от 22.05.2001. Там ничего про Windows 98 не сказано.
Это первое. А коли ты знал, что функция GetDiskFreeSpace глючная, зачем же тогда ее привел?

Автор: Yanis 22.8.2006, 09:51
Цитата(GSV4 @  22.8.2006,  10:40 Найти цитируемый пост)
To Yanis:
А где ты ее взял? Лично я читаю файл "C:\Program Files\Common Files\Borland Shared\MSHelp\WIN32.HLP" от 22.05.2001. Там ничего про Windows 98 не сказано.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/getdiskfreespace.asp

Цитата(GSV4 @  22.8.2006,  10:40 Найти цитируемый пост)
А коли ты знал, что функция GetDiskFreeSpace глючная, зачем же тогда ее привел?

А где было написано, что ты пишешь под антиквариат?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)