| 導購 | 订阅 | 在线投稿
分享
 
 
 

在DELPHI中獲得磁盤容量

來源:互聯網網民  2006-06-09 19:29:12  評論

使用如下API函數

BOOL GetDiskFreeSpace(

LPCTSTR lpRootPathName, // address of root path

LPDWORD lpSectorsPerCluster, // address of sectors per cluster

LPDWORD lpBytesPerSector, // address of bytes per sector

LPDWORD lpNumberOfFreeClusters, // address of number of free clusters

LPDWORD lpTotalNumberOfClusters // address of total number of clusters

);

Parameters

lpRootPathName

Points to a null-terminated string that specifies the root directory of the disk to return information about. If lpRootPathName

is NULL, the function uses the root of the current directory.

lpSectorsPerCluster

Points to a variable for the number of sectors per cluster.

lpBytesPerSector

Points to a variable for the number of bytes per sector.

lpNumberOfFreeClusters

Points to a variable for the total number of free clusters on the disk.

lpTotalNumberOfClusters

Points to a variable for the total number of clusters on the disk.

Return Values

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero. To get extended error information, call GetLastError.

例子:

procedure TForm1.Button1Click(Sender: TObject);

var DriveString:String;

sec1, byt1, cl1, cl2: LongWord;

Disk_FreeSpace : real;

begin

GetDiskFreeSpace('d:\', sec1, byt1, cl1, cl2);

Disk_FreeSpace := (cl1 / (1024*1024*1024))*sec1*byt1;

showmessage(format('該驅動器容量是%0.3fG',[Disk_FreeSpace]));

end;

上面的程序是將數據從字節單位轉換爲G的,之所以這樣做,是爲了避免當磁盤容量大于DELPHI基本數據類型所能存儲的最大值,避免溢出。如果想獲得以字節爲單位的,那麽將遇到大數相乘的問題。

下面提供一個大數相乘的算法,他接收兩個字符串,輸出這個兩個字符串的乘積(當然字符串裏都是數字)

function TForm1.XAddY(x, y: string): string;

var

a,b,c:array[1..1000] of integer;

i,j,k,l,m,code:integer;

s,p,r:string;

begin

s := x; //兩個要相乘的字符串

p := y;

l:=length(s);

for i:=l downto 1 do

Val(s[i],a[l-i+1],code);

m:=length(p);

for i:=m downto 1 do

Val(p[i],b[m-i+1],code);

for j:=1 to m do

for i:=1 to l do

begin

if c[i+j-1]+a[i]*b[j]<=9 then begin

c[j+i-1]:=c[i+j-1]+a[i]*b[j];

k:=i+j-1;

end else begin

c[j+i-1]:=c[i+j-1]+(a[i]*b[j]) mod 10;

c[j+i]:=c[j+i]+ c[j+i-1] div 10+ (a[i]*b[j]) div 10;

c[i+j-1]:=c[i+j-1] mod 10;

k:=i+j;

end;

end;

r := '';

for i:=k downto 1 do

r := r+IntToStr(c[i]);

Result := r;

end;

下面我們就可以通過使用大數相乘的算法的得到磁盤的容量(用字節表示)

procedure TForm1.Button2Click(Sender: TObject);

var

sec1, byt1, cl1, cl2: LongWord;

Disk_FreeSpace : string;

begin

GetDiskFreeSpace('d:\', sec1, byt1, cl1, cl2);

Disk_FreeSpace := XAddY(inttostr(cl1),inttostr(sec1*byt1));

showmessage(format('該驅動器容量是%s字節',[Disk_FreeSpace]));

end;

程序完整的代碼如下:

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;

type

TForm1 = class(TForm)

Button1: TButton;

Label1: TLabel;

Label2: TLabel;

Button2: TButton;

Label3: TLabel;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

private

{ Private declarations }

public

function XAddY(x : string;y:string) : string;

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

var DriveString:String;

sec1, byt1, cl1, cl2: LongWord;

Disk_FreeSpace : real;

begin

GetDiskFreeSpace('d:\', sec1, byt1, cl1, cl2);

Disk_FreeSpace := (cl1 / (1024*1024*1024))*sec1*byt1;

showmessage(format('該驅動器容量是%0.3fG',[Disk_FreeSpace]));

end;

function TForm1.XAddY(x, y: string): string;

var

a,b,c:array[1..1000] of integer;

i,j,k,l,m,code:integer;

s,p,r:string;

begin

s := x; //兩個要相乘的字符串

p := y;

l:=length(s);

for i:=l downto 1 do

Val(s[i],a[l-i+1],code);

m:=length(p);

for i:=m downto 1 do

Val(p[i],b[m-i+1],code);

for j:=1 to m do

for i:=1 to l do

begin

if c[i+j-1]+a[i]*b[j]<=9 then begin

c[j+i-1]:=c[i+j-1]+a[i]*b[j];

k:=i+j-1;

end else begin

c[j+i-1]:=c[i+j-1]+(a[i]*b[j]) mod 10;

c[j+i]:=c[j+i]+ c[j+i-1] div 10+ (a[i]*b[j]) div 10;

c[i+j-1]:=c[i+j-1] mod 10;

k:=i+j;

end;

end;

r := '';

for i:=k downto 1 do

r := r+IntToStr(c[i]);

Result := r;

end;

procedure TForm1.Button2Click(Sender: TObject);

var

sec1, byt1, cl1, cl2: LongWord;

Disk_FreeSpace : string;

begin

GetDiskFreeSpace('d:\', sec1, byt1, cl1, cl2);

Disk_FreeSpace := XAddY(inttostr(cl1),inttostr(sec1*byt1));

showmessage(format('該驅動器容量是%s字節',[Disk_FreeSpace]));

end;

end.

 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
使用如下API函數 BOOL GetDiskFreeSpace( LPCTSTR lpRootPathName, // address of root path LPDWORD lpSectorsPerCluster, // address of sectors per cluster LPDWORD lpBytesPerSector, // address of bytes per sector LPDWORD lpNumberOfFreeClusters, // address of number of free clusters LPDWORD lpTotalNumberOfClusters // address of total number of clusters ); Parameters lpRootPathName Points to a null-terminated string that specifies the root directory of the disk to return information about. If lpRootPathName is NULL, the function uses the root of the current directory. lpSectorsPerCluster Points to a variable for the number of sectors per cluster. lpBytesPerSector Points to a variable for the number of bytes per sector. lpNumberOfFreeClusters Points to a variable for the total number of free clusters on the disk. lpTotalNumberOfClusters Points to a variable for the total number of clusters on the disk. Return Values If the function succeeds, the return value is nonzero. If the function fails, the return value is zero. To get extended error information, call GetLastError. 例子: procedure TForm1.Button1Click(Sender: TObject); var DriveString:String; sec1, byt1, cl1, cl2: LongWord; Disk_FreeSpace : real; begin GetDiskFreeSpace('d:\', sec1, byt1, cl1, cl2); Disk_FreeSpace := (cl1 / (1024*1024*1024))*sec1*byt1; showmessage(format('該驅動器容量是%0.3fG',[Disk_FreeSpace])); end; 上面的程序是將數據從字節單位轉換爲G的,之所以這樣做,是爲了避免當磁盤容量大于DELPHI基本數據類型所能存儲的最大值,避免溢出。如果想獲得以字節爲單位的,那麽將遇到大數相乘的問題。 下面提供一個大數相乘的算法,他接收兩個字符串,輸出這個兩個字符串的乘積(當然字符串裏都是數字) function TForm1.XAddY(x, y: string): string; var a,b,c:array[1..1000] of integer; i,j,k,l,m,code:integer; s,p,r:string; begin s := x; //兩個要相乘的字符串 p := y; l:=length(s); for i:=l downto 1 do Val(s[i],a[l-i+1],code); m:=length(p); for i:=m downto 1 do Val(p[i],b[m-i+1],code); for j:=1 to m do for i:=1 to l do begin if c[i+j-1]+a[i]*b[j]<=9 then begin c[j+i-1]:=c[i+j-1]+a[i]*b[j]; k:=i+j-1; end else begin c[j+i-1]:=c[i+j-1]+(a[i]*b[j]) mod 10; c[j+i]:=c[j+i]+ c[j+i-1] div 10+ (a[i]*b[j]) div 10; c[i+j-1]:=c[i+j-1] mod 10; k:=i+j; end; end; r := ''; for i:=k downto 1 do r := r+IntToStr(c[i]); Result := r; end; 下面我們就可以通過使用大數相乘的算法的得到磁盤的容量(用字節表示) procedure TForm1.Button2Click(Sender: TObject); var sec1, byt1, cl1, cl2: LongWord; Disk_FreeSpace : string; begin GetDiskFreeSpace('d:\', sec1, byt1, cl1, cl2); Disk_FreeSpace := XAddY(inttostr(cl1),inttostr(sec1*byt1)); showmessage(format('該驅動器容量是%s字節',[Disk_FreeSpace])); end; 程序完整的代碼如下: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Label1: TLabel; Label2: TLabel; Button2: TButton; Label3: TLabel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public function XAddY(x : string;y:string) : string; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var DriveString:String; sec1, byt1, cl1, cl2: LongWord; Disk_FreeSpace : real; begin GetDiskFreeSpace('d:\', sec1, byt1, cl1, cl2); Disk_FreeSpace := (cl1 / (1024*1024*1024))*sec1*byt1; showmessage(format('該驅動器容量是%0.3fG',[Disk_FreeSpace])); end; function TForm1.XAddY(x, y: string): string; var a,b,c:array[1..1000] of integer; i,j,k,l,m,code:integer; s,p,r:string; begin s := x; //兩個要相乘的字符串 p := y; l:=length(s); for i:=l downto 1 do Val(s[i],a[l-i+1],code); m:=length(p); for i:=m downto 1 do Val(p[i],b[m-i+1],code); for j:=1 to m do for i:=1 to l do begin if c[i+j-1]+a[i]*b[j]<=9 then begin c[j+i-1]:=c[i+j-1]+a[i]*b[j]; k:=i+j-1; end else begin c[j+i-1]:=c[i+j-1]+(a[i]*b[j]) mod 10; c[j+i]:=c[j+i]+ c[j+i-1] div 10+ (a[i]*b[j]) div 10; c[i+j-1]:=c[i+j-1] mod 10; k:=i+j; end; end; r := ''; for i:=k downto 1 do r := r+IntToStr(c[i]); Result := r; end; procedure TForm1.Button2Click(Sender: TObject); var sec1, byt1, cl1, cl2: LongWord; Disk_FreeSpace : string; begin GetDiskFreeSpace('d:\', sec1, byt1, cl1, cl2); Disk_FreeSpace := XAddY(inttostr(cl1),inttostr(sec1*byt1)); showmessage(format('該驅動器容量是%s字節',[Disk_FreeSpace])); end; end.
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 
 熱帖排行
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有