Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.09.2008, 18:33   #1
AIst
Пользователь
 
Аватар для AIst
 
Регистрация: 30.06.2008
Сообщений: 58
По умолчанию информация о дисках

Пишу програмку одну, застрял на информации о томе(диске):

Код:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ShellApi, Menus, StdCtrls, FileCtrl;

............... 

procedure TForm1.DriveComboBox1Change(Sender: TObject);
var
     PathName : PChar; //  путь к диску(тому)
	 SecInCluster : DWORD;      //  количество секторов в одном кластере
	 ByteInSector : DWORD;      //  количество байт в одном секторе
	 FreeClOnDisk : DWORD;      //  количество свободных кластеров на диске(томе)
	 AllClOnDisk : DWORD;      //  всего кластеров
begin

GetDiskFreeSpace(PathName, SecInCluster, ByteInSector, FreeClOnDisk, AllClOnDisk);
memo1.Lines.Add('Осталось: ' + inttostr(Round((ByteInSector*SecInCluster*FreeClOnDisk) / 1024)) + 'Кб');
memo1.Lines.Add(' ');
memo1.Lines.Add('Всего:' + inttostr(Round((ByteInSector*SecInCluster*AllClOnDisk) / 1024)) + 'Кб');
end;
Программа выдает:

Осталось: 3559824 Кб ( примерно 3,4 Гб)
Всего: 2286548 Кб ( примерно 2,2 Гб)

На самом деле том у меня такой:
Осталось: 15,3 Гб
Всего: 34,1 Гб
другой том у меня 100 Гб, так программа говорит, что он 10 Гб...
для cd дисков она нормальный размер определяет.
Где моя ошибка? Почему результат такой?
AIst вне форума Ответить с цитированием
Старый 09.09.2008, 19:26   #2
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

Юзай GetDiskFreeSpaceEx
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Старый 09.09.2008, 19:28   #3
Ozerich
Студент 1 курса
Форумчанин Подтвердите свой е-майл
 
Аватар для Ozerich
 
Регистрация: 27.06.2008
Сообщений: 959
По умолчанию

Код:

TdriveInfo=packed record
sernumber:string;
tomlabel:string;
filesystem:string;
sectorsinclaster:string;
bytesinsector:string;
maximumlength:string;
diskfreesize:string;
disksize:string;
diskusagesize:string;
totalclasters:string;
freeclasters:string;
end;

function getDriveinfo(diskname:string):TDriveinfo;
var
  lpRootPathName:  PChar;
  lpVolumeNameBuffer: PChar;
  nVolumeNameSize: DWORD;
  lpVolumeSerialNumber: DWORD;
  lpMaximumComponentLength: DWORD;
  lpFileSystemFlags: DWORD;
  lpFileSystemNameBuffer: PChar;
  nFileSystemNameSize: DWORD;
  FSectorsPerCluster: DWORD;
  FBytesPerSector   : DWORD;
  FFreeClusters     : DWORD;
  FTotalClusters    : DWORD;

begin
diskname:=diskname[1];
if not directoryexists(diskname+':\') then exit;

lpVolumeSerialNumber    := 0;
lpMaximumComponentLength:= 0;
lpFileSystemFlags       := 0;
getmem(lpVolumeNameBuffer,MAX_PATH+1);
getmem(lpfilesystemnamebuffer,MAX_PATH+1);
nvolumenamesize:=MAX_PATH+1;
nFileSystemNameSize:=MAX_PATH+1;
lprootpathname:=Pchar(diskname+':\');
if getvolumeinformation(lprootpathname,lpvolumenamebuffer,nvolumenamesize,@lpvolumeserialnumber,lpmaximumcomponentlength,lpfilesystemflags,lpfilesystemnamebuffer,nfilesystemnamesize)
then begin
getdiskfreespace(lprootpathname,Fsectorspercluster,Fbytespersector,ffreeclusters,FtotalClusters);
result.sernumber:=IntToHex(HIWord(lpVolumeSerialNumber), 4) + '-' +IntToHex(LOWord(lpVolumeSerialNumber), 4);
result.tomlabel:=lpvolumenamebuffer;
result.filesystem:=lpfilesystemnamebuffer;
result.sectorsinclaster:=inttostr(FsectorsperCluster);
result.bytesinsector:=inttostr(FBytesPerSector);
result.maximumlength:=inttostr(lpMaximumComponentlength);
result.diskfreesize:=floattostr(GetFreeDiskSize(diskname));
result.disksize:=floattostr(getTotaldisksize(diskname));
result.diskusagesize:=floattostr(gettotaldisksize(diskname)-getfreedisksize(diskname));
result.totalclasters:=inttostr(FTotalClusters);
result.freeclasters:=inttostr(fFreeClusters);
freemem(lpvolumenamebuffer);
freemem(lpfilesystemnamebuffer);
end;
end;
C++(STL, QT, WinInet) / DHTML(CSS) / JavaScript / PHP Developer
Ozerich вне форума Ответить с цитированием
Старый 09.09.2008, 20:01   #4
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Просто всё дело в переполнении. Замени эту строку
Код:
memo1.Lines.Add('Осталось: ' + inttostr(Round((ByteInSector*SecInCluster*FreeClOnDisk) / 1024)) + 'Кб');
на эти
Код:
int64_:=FreeClOnDisk;
int64_:=int64_*SecInCluster;
int64_:=int64_*ByteInSector;
memo1.Lines.Add('Осталось: ' + inttostr(int64_ div 1024) + 'Кб')
где var int64_: int64
eoln вне форума Ответить с цитированием
Старый 09.09.2008, 22:52   #5
AIst
Пользователь
 
Аватар для AIst
 
Регистрация: 30.06.2008
Сообщений: 58
По умолчанию

всем спасибо. теперь все работает. аж стыдно, что long int выпало из головы...
AIst вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужна информация по Oracle! Николай_ Помощь студентам 1 15.09.2008 12:09
VBA и информация о системе iammajor Microsoft Office Excel 2 07.07.2008 05:48
информация о процессоре Миша Помощь студентам 7 17.10.2007 19:04
на дисках с Windows есть какая-то защита от копирования? Viteef Windows 1 17.07.2007 05:50
Нужна информация по mp3 тегам ozhjog Мультимедиа в Delphi 4 11.05.2007 00:41