![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
![]() Как узнать свободное и занятое место на определленном диске - и отображать не с байтами а Кб, Мб, Гб, Тбайтами??????
Заранее благодарю!! |
#2
|
||||
|
||||
![]() Если что - 1 Тб - 1024 Гб.
Код:
uses SysUtils; implementation function GetDiskSize(drive: Char; var free_size, total_size: Int64): Boolean; var RootPath: array[0..4] of Char; RootPtr: PChar; current_dir: string; begin RootPath[0] := Drive; RootPath[1] := ':'; RootPath[2] := '\'; RootPath[3] := #0; RootPtr := RootPath; current_dir := GetCurrentDir; if SetCurrentDir(drive + ':\') then begin GetDiskFreeSpaceEx(RootPtr, Free_size, Total_size, nil); // this to turn back to original dir SetCurrentDir(current_dir); Result := True; end else begin Result := False; Free_size := -1; Total_size := -1; end; end; procedure TForm1.Button1Click(Sender: TObject); var free_size, total_size: Int64; begin if GetDiskSize(DriveComboBox1.Drive, free_size, total_size) then ShowMessage('free space =' + IntToStr(free_size) + #13 + 'total size=' + IntToStr(total_size)) else ShowMessage('No disk in drive!'); end; Последний раз редактировалось Winny, 26.09.2007 в 10:19. |
#3
|
||||
|
||||
![]() А потом получившееся число можно перевести в Терра Байты
|
#4
|
||||
|
||||
![]() В том то и дело что у мя не получаеться перевести полученное на Гб или в Мб -ты
и еще нелзяли без сомбобох драйва - у мя уже диск выбран С:\ типа так Код:
function GetDiskFreeSpaceEx(lpDirectoryName: PAnsiChar; var lpFreeBytesAvailableToCaller : Integer; var lpTotalNumberOfBytes: Integer; var lpTotalNumberOfFreeBytes: Integer) : bool; stdcall; external kernel32 name 'GetDiskFreeSpaceExA'; procedure GetDiskSizeAvail(TheDrive : PChar; var TotalBytes : double; var TotalFree : double); var AvailToCall : integer; TheSize : integer; FreeAvail : integer; begin GetDiskFreeSpaceEx(TheDrive, AvailToCall, TheSize, FreeAvail); {$IFOPT Q+} {$DEFINE TURNOVERFLOWON} {$Q-} {$ENDIF} if TheSize >= 0 then TotalBytes := TheSize else if TheSize = -1 then begin TotalBytes := $7FFFFFFF; TotalBytes := TotalBytes * 2; TotalBytes := TotalBytes + 1; end else begin TotalBytes := $7FFFFFFF; TotalBytes := TotalBytes + abs($7FFFFFFF - TheSize); end; if AvailToCall >= 0 then TotalFree := AvailToCall else if AvailToCall = -1 then begin TotalFree := $7FFFFFFF; TotalFree := TotalFree * 2; TotalFree := TotalFree + 1; end else begin TotalFree := $7FFFFFFF; TotalFree := TotalFree + abs($7FFFFFFF - AvailToCall); end; end; procedure TForm1.Button1Click(Sender: TObject); var TotalBytes: double; TotalFree: double; begin GetDiskSizeAvail('C:\', TotalBytes, TotalFree); label1.Caption:='Îáøèé = '+(FloatToStr(TotalBytes)); label2.Caption:='Ñâîáîäíî = '+(FloatToStr(TotalFree)); end; Последний раз редактировалось Electronic_Arts, 25.09.2007 в 21:31. |
#5
|
||||
|
||||
![]() Цитата:
|
#6
|
||||
|
||||
![]() Обоже - да вы вообще читаете что я пишу - как перевести дайте какой нить исходник у меня не получаеться
|
#7
|
||||
|
||||
![]() Вот, не парься:
Код:
function GetFreeDriveSpace(sDriveLetter, sSizeType: String): Int64; const CharString: String[26] = 'abcdefghijklmnopqrstuvwxyz'; var FreeBytesAvailableToCaller: Int64; FreeSize: Int64; TotalSize: Int64; btCounter: Byte; bContain: Boolean; begin Result := 0; sDriveLetter := LowerCase(sDriveLetter); SetLength(sDriveLetter,2); sDriveLetter[2] := ':'; bContain := False; for btCounter := 0 to 26 do begin if AnsiStartsText(CharString[btCounter],sDriveLetter) = True then begin bContain := True; Break; end; end; if bContain = False then begin Result := 0; Exit; end; GetDiskFreeSpaceEx(PChar(sDriveLetter),FreeBytesAvailableToCaller,Totalsize,@FreeSize); if LowerCase(sSizeType) = 'b' then begin Result := FreeBytesAvailableToCaller; end else if LowerCase(sSizeType) = 'kb' then begin Result := FreeBytesAvailableToCaller div 1024; end else if LowerCase(sSizeType) = 'mb' then begin Result := FreeBytesAvailableToCaller div 1048576; end else if LowerCase(sSizeType) = 'gb' then begin Result := FreeBytesAvailableToCaller div 1073741824; end else if LowerCase(sSizeType) = 'tb' then begin Result := FreeBytesAvailableToCaller div 1073741824; // написал в 2 строки, т.к. не помню, выйдет ли Result := Result div 1024; // за рамки допустимого число 1099511627776, так сказать, чтобы не рисковать =) end; end; Набросал на скорую руку (не проверял в делфе), можно сделать оптимизированнее. PS: в качестве параметра sDriveLetter передавай только букву диска, без двоеточия и слэша, т.е. не C:\ или C:, а просто C. в качестве параметра sSizeType передавай b,kb,mb,gb,tb - ну соответственно, результатом ф-ии будет размер в байтах, килобайтах, мегабайтах, гигабайтах или террабайтах. THE CRACKER IS OUT THERE Последний раз редактировалось 4kusNick, 26.09.2007 в 22:40. |