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


Автор: ne0n 23.4.2006, 14:09
Вобщем надо определить сколько  Мегабайт( или байт, не важно ) занимают файлы на всем винче?   

Автор: Albinos_x 23.4.2006, 14:47
перебираешь диски, смотришь размер диска и свободное место, из первого вычитаешь второе и суммируешь...

Добавлено @ 14:53 
Цитата(Albinos_x @  23.4.2006,  14:47 Найти цитируемый пост)
смотришь размер диска и свободное место, из первого вычитаешь второе и суммируешь... 


Цитата

function DiskFree(Drive: Byte): Longint;   Возвращает количество в байтах свободного места на заданном диске. Значение параметра Drive: 0 — для текущего диска, 1 — для А, 2 — для В и т. д. Если параметр неверен, функция возвращает -1. 
    
function DiskSize(Drive: Byte): Longint;   Возвращает размер диска Drive в байтах. Параметр Drive означает то же, что и в DiskFree. 


Цитата(Albinos_x @  23.4.2006,  14:47 Найти цитируемый пост)
перебираешь диски

Код
...
var
  Drive: Char; // Буква диска
  lst:TStringList;
  sf:string;
const
  pref = ':\';
begin
lst:=TStringList.Create;
lst.Clear;
for Drive:= 'A' to 'Z' do
   if GetDriveType(PChar(Drive + pref)) = DRIVE_FIXED then
      lst.Add(Drive + pref);
...
lst.Free;
...
 

Автор: Poseidon 23.4.2006, 14:55
Вот накидал тут, разберешся.

Код
uses Math;

function GetHDDUsedSpace: Currency;
var
 DriveChar: char;
 Drive: array of byte;
 i: integer;
 res: Currency;
begin
i:= 0;
 for DriveChar:= 'A' to 'Z' do
  begin
  inc(i);
  if GetDriveType(PChar(DriveChar + ':\')) = DRIVE_FIXED
  then
    begin
    SetLength(Drive, Length(Drive)+1);
    Drive[Length(Drive)-1]:= i;
    end;
  end;

Res:= 0;
for i:= 0 to Length(Drive)-1 do
Res:= Res + SimpleRoundTo(DiskSize(Drive[i])/(1024*1024) -
                          DiskFree(Drive[i])/(1024*1024), -2);

Result:= res;
end;

// использование
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(FloatToStr(GetHDDUsedSpace) + ' MB');
end;

    

Автор: Albinos_x 23.4.2006, 14:56
Цитата(Albinos_x @  23.4.2006,  14:47 Найти цитируемый пост)
перебираешь диски

хотя для перебора в твоём случае достаточно запутить обыный цыкл от 0 до 23...

Добавлено @ 15:02 
т.е. :
Код

...
GlobalSz:=0;
for i:=1 to 23 do
   begin
   fr:=DiskFree(i);
   if fr>=0 then
     begin
     Sz:=DiskSize(i);
     GlobalSz:=GlobalSz+(Sz-fr);
     end;
   end;
ShowMessage('размер всех файло равен = '+floattostr(GlobalSz/1048576)+' Мб');
...
 

Автор: Albinos_x 23.4.2006, 15:13
приведённый код получит размер всех файлов включая флоп и СD, если они установлены, если нужно только HDD, то:
Код
...
// функция получения размера всех файлов на всех дисках в байтах
function GlobalFileSize:Int64;
var i : byte;
     GlobalSz, fr, Sz : Int64; 
begin
GlobalSz:=0;    
for i:=1 to 23 do    
   begin
  if GetDriveType(PChar(char(i+$41) + ':\'))=Drive_Fixed then
      begin    
      fr:=DiskFree(i);    
      if fr>=0 then    
        begin    
        Sz:=DiskSize(i);    
        GlobalSz:=GlobalSz+(Sz-fr);    
        end;
      end;    
   end;    
Result:=GlobalSz;
end;

// использование
procedure TForm1.SpeedButton1Click(Sender: TObject);  
begin  
ShowMessage('размер всех файло равен = '+floattostr(GlobalFileSize/1048576)+' Мб');    
end;
...

  

Автор: ne0n 24.4.2006, 14:13
Albinos_x,  опять выручаешь. + 

Автор: Albinos_x 24.4.2006, 20:21
 smile  smile  smile  

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