Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 25.09.2007, 18:44
Аватар для Electronic_Arts
Electronic_Arts Electronic_Arts вне форума
Местный
 
Регистрация: 13.07.2006
Адрес: на земле
Сообщения: 562
Версия Delphi: Delphi 11
Репутация: 18
Восклицание Как узнать емкость диска???

Как узнать свободное и занятое место на определленном диске - и отображать не с байтами а Кб, Мб, Гб, Тбайтами??????

Заранее благодарю!!
Ответить с цитированием
  #2  
Старый 25.09.2007, 18:52
Аватар для Winny
Winny Winny вне форума
Продвинутый
 
Регистрация: 26.05.2007
Адрес: Планета земля, Россия, Москва
Сообщения: 620
Репутация: 30
По умолчанию

Если что - 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  
Старый 25.09.2007, 18:55
Аватар для Winny
Winny Winny вне форума
Продвинутый
 
Регистрация: 26.05.2007
Адрес: Планета земля, Россия, Москва
Сообщения: 620
Репутация: 30
По умолчанию

А потом получившееся число можно перевести в Терра Байты
__________________

Ответить с цитированием
  #4  
Старый 25.09.2007, 21:24
Аватар для Electronic_Arts
Electronic_Arts Electronic_Arts вне форума
Местный
 
Регистрация: 13.07.2006
Адрес: на земле
Сообщения: 562
Версия Delphi: Delphi 11
Репутация: 18
Восклицание

В том то и дело что у мя не получаеться перевести полученное на Гб или в Мб -ты

и еще нелзяли без сомбобох драйва - у мя уже диск выбран С:\ типа так

Код:
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  
Старый 26.09.2007, 06:53
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Winny
Если что - 1 Тб - 1024 Мб.
Если что 1Тб - 1024Гб - 1024*1024Мб
Ответить с цитированием
  #6  
Старый 26.09.2007, 17:00
Аватар для Electronic_Arts
Electronic_Arts Electronic_Arts вне форума
Местный
 
Регистрация: 13.07.2006
Адрес: на земле
Сообщения: 562
Версия Delphi: Delphi 11
Репутация: 18
Восклицание

Обоже - да вы вообще читаете что я пишу - как перевести дайте какой нить исходник у меня не получаеться
Ответить с цитированием
  #7  
Старый 26.09.2007, 22:27
Аватар для 4kusNick
4kusNick 4kusNick вне форума
Местный
 
Регистрация: 06.09.2006
Адрес: Россия, Санкт-Петербург
Сообщения: 444
Репутация: 550
По умолчанию

Вот, не парься:
Код:
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.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:54.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025