Solved

GetDiskFreeSpaceEx

Posted on 2000-04-01
17
361 Views
Last Modified: 2010-04-04
Is available any demo app that can show disk free space ?

 with theese function or other ?

 Esk
0
Comment
Question by:esk
  • 8
  • 6
  • 3
17 Comments
 
LVL 13

Accepted Solution

by:
Epsylon earned 10 total points
ID: 2676831
Use the DiskFree function:

function DiskFree(Drive: Byte): Int64;

0 = current drive
1 = A:
2 = B:
3 = C:
etc...
0
 
LVL 17

Expert Comment

by:inthe
ID: 2677014
The functions DiskSize & DiskFree are not capable of handling drives larger than 2 gigabyte..

THIS IS FROM SOME FAQ:
FAQ2552D.txt   Checking available disk space on large drives.
Category   :Windows API
Platform    :All
Product    :All 32 bit  

Question:
How do I check for available diskspace on a drive larger than 2
gigabytes?


Answer:
You will need to call the Windows API function GetDiskFreeSpaceEx()
and convert the returned integers to doubles, since integers greater
than 2 gigabytes are not supported in Delphi.

Example:

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);
  ShowMessage(FloatToStr(TotalBytes));
  ShowMessage(FloatToStr(TotalFree));
end;


Regards Barry
0
 
LVL 13

Expert Comment

by:Epsylon
ID: 2677026
>The functions DiskSize & DiskFree are not capable of handling drives larger than 2 gigabyte..

In Delphi 4 and 5 they work perfectly!
0
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 17

Expert Comment

by:inthe
ID: 2677060
mmm..i had to search to some searching cause i was sure i was right about the drive limits.and yes your correct for d4/5 , for other versions of delphi it returns longint so that is why the drive size limit of less than 2gig. ;-)
0
 

Author Comment

by:esk
ID: 2677063
Inthe, i get an error in this line

 GetDiskFreeSpaceEx(TheDrive,
                                           AvailToCall,
                                           TheSize,
                                           FreeAvail);
Not integer!

Esk
0
 

Author Comment

by:esk
ID: 2677068
Epsylon, this function does not return same size as Windows

function DiskFree(Drive: Byte): Int64;

Esk
0
 
LVL 17

Expert Comment

by:inthe
ID: 2677070
what version of delphi you using ?
0
 

Author Comment

by:esk
ID: 2677073
Here is a component that can shows free diskspace but it's .dcu file

http://www.besse.de/delphi/d40flib.htm
0
 

Author Comment

by:esk
ID: 2677074
Delphi 5. professional
0
 
LVL 13

Expert Comment

by:Epsylon
ID: 2677077
Esk, DiskFree uses GetDiskFreeSpace internally. That means that GetDiskFreeSpace and GetDiskFreeSpaceEx will return the same values as DiskFree.
0
 
LVL 13

Expert Comment

by:Epsylon
ID: 2677080
I have a 27 GB HDD here and DiskFree returns exactly the same as Windows tells me....
0
 

Author Comment

by:esk
ID: 2677083
I do this

Button1.Caption := IntToStr(DiskSize(3) Div 1024 Div 1024);
0
 
LVL 13

Expert Comment

by:Epsylon
ID: 2677089
DiskSize? I though you needed DiskFree..?

Anyway, both function work ok here.
0
 

Author Comment

by:esk
ID: 2677094
This works

Esk
0
 
LVL 13

Expert Comment

by:Epsylon
ID: 2677097
Alright, I can go to bed now   :o)
0
 

Author Comment

by:esk
ID: 2677124
i have one more.

how can i detect if no disk is in drive a:\

Esk
0
 

Author Comment

by:esk
ID: 2677561
it's okay, i have solve the problem. Found code.

Esk
0

Featured Post

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Delphi inherited method 6 78
Breakpoint doesn't stop in my variable 3 36
shape, triangle, dbctrlgrid 3 31
IP without any Dots 1 50
Introduction The parallel port is a very commonly known port, it was widely used to connect a printer to the PC, if you look at the back of your computer, for those who don't have newer computers, there will be a port with 25 pins and a small print…
In my programming career I have only very rarely run into situations where operator overloading would be of any use in my work.  Normally those situations involved math with either overly large numbers (hundreds of thousands of digits or accuracy re…

685 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question