计算磁盘空间的时候,磁盘空间太大,cluster太大,计算出的数据总不对,是不是数据溢出了,怎么解决?

zgp0312 2003-08-19 08:30:12
procedure TForm3.systeminfo(Sender: TObject); //获取系统信息
var systeminfo: SYSTEM_INFO;
sector,byte,cluster,free: DWORD;
freespace,totalspace: longint;
CDtype: UINT;
name: CHAR;
drvname: string;
volname,filesysname: PCHAR;
sno,maxl,fileflag: DWORD;
begin
Memo2.Lines.Clear();
//获得CPU型号
GetSystemInfo(systeminfo);
Memo2.Lines.Add('您的CPU类型是:' + inttostr(systeminfo.dwProcessorType));

//获得C盘可用空间
GetDiskFreeSpace('C:', LPDWORD(@sector)^, LPDWORD(@byte)^, LPDWORD(@free)^, LPDWORD(@cluster)^); //获得返回参数

totalspace := (cluster div 1024 * byte * sector ) div 1024 ; //计算总容量
Memo2.Lines.Add('C盘总空间(' + inttostr(integer(totalspace)) + 'MB)。');

freespace := (free * byte * sector )div 1024 div 1024 ; //计算可用空间
Memo2.Lines.Add('C盘可用空间(' + inttostr(integer(freespace)) + 'MB)。');

//获得D盘可用空间
GetDiskFreeSpace('D:', LPDWORD(@sector)^, LPDWORD(@byte)^, LPDWORD(@free)^, LPDWORD(@cluster)^); //获得返回参数
totalspace := (cluster div 1024 )* byte * sector div 1024; //计算总容量
freespace := free * byte * sector div 1024 div 1024; //计算可用空间
Memo2.Lines.Add('D盘总空间(' + inttostr(integer(totalspace)) + 'MB)。');
Memo2.Lines.Add('D盘可用空间(' + inttostr(integer(freespace)) + 'MB)。');

//获得E盘可用空间
GetDiskFreeSpace('E:', LPDWORD(@sector)^, LPDWORD(@byte)^, LPDWORD(@free)^, LPDWORD(@cluster)^); //获得返回参数
totalspace := (cluster div 1024 )* byte * sector div 1024; //计算总容量
freespace := free * byte * sector div 1024 div 1024; //计算可用空间
Memo2.Lines.Add('E盘总空间(' + inttostr(integer(totalspace)) + 'MB)。');
Memo2.Lines.Add('E盘可用空间(' + inttostr(integer(freespace)) + 'MB)。');

//获得F盘可用空间
GetDiskFreeSpace('F:', LPDWORD(@sector)^, LPDWORD(@byte)^, LPDWORD(@free)^, LPDWORD(@cluster)^); //获得返回参数
totalspace := (cluster div 1024 div 1024 )* byte * sector; //计算总容量
freespace := free * byte * sector div 1024 div 1024; //计算可用空间
Memo2.Lines.Add('F盘总空间(' + inttostr(integer(totalspace)) + 'MB)。');
Memo2.Lines.Add('F盘可用空间(' + inttostr(integer(freespace)) + 'MB)。');

//检测CD-ROM,是否有光盘
GetMem(volname, 255);
GetMem(filesysname, 100);
for name :='C' to 'Z' do//循环检测A~Z
begin
drvname := name + ':';
CDtype := GetDriveType(PCHAR(@drvname[1])); //获得磁盘类型
if (CDtype = DRIVE_CDROM) then
begin
Memo2.Lines.Add('您的光驱盘符为[' + drvname + ']');
volname^ := Chr(0);
filesysname^ := Chr(0);
if ( not (GetVolumeInformation(PCHAR(@drvname[1]), volname, 250, LPDWORD(@sno), LPDWORD(@maxl)^, LPDWORD(@fileflag)^, filesysname,100))) then
Memo2.Lines.Add(drvname + '驱中没有发现光盘') //如果返回值为假
else //如果返回值为真
begin
Memo2.Lines.Add (drvname + '驱中光盘卷标为: [' + String(volname) + ']');
Memo2.Lines.Add (drvname + '驱中光盘序号为: [' + inttostr(sno) + ']');
end;
end;
end;
FreeMem(volname);
FreeMem(filesysname);
end;


用这样的方法来计算磁盘空间的时候,磁盘空间太大,cluster太大,计算出的数据总不对,是不是数据溢出了,怎么解决?
...全文
44 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
d983074 2003-08-19
  • 打赏
  • 举报
回复
楼上的说的没错,改写了一下,原来的不支持大于4个分区,我的G盘看不出来^_^

var systeminfo: SYSTEM_INFO;
sector,byte,cluster,free: DWORD;
freespace,totalspace: int64;
CDtype: UINT;
name: CHAR;
drvname: string;
volname,filesysname: PCHAR;
sno,maxl,fileflag: DWORD;
begin
Memo2.Lines.Clear();
//获得CPU型号
GetSystemInfo(systeminfo);
Memo2.Lines.Add('您的CPU类型是:' + inttostr(systeminfo.dwProcessorType));

for name :='C' to 'Z' do//循环检测A~Z
begin//获得盘可用空间
drvname:=name+':';
GetDiskFreeSpace(pchar(drvname), LPDWORD(@sector)^, LPDWORD(@byte)^, LPDWORD(@free)^, LPDWORD(@cluster)^); //获得返回参数

totalspace := (cluster div 1024 * byte * sector ) div 1024 ; //计算总容量
if totalspace<>0 then
Memo2.Lines.Add(name+'盘总空间(' + inttostr(integer(totalspace)) + 'MB)。');

freespace := (free * byte * sector )div 1024 div 1024 ; //计算可用空间
if freespace<>0 then
Memo2.Lines.Add(name+'盘可用空间(' + inttostr(integer(freespace)) + 'MB)。');
end;

//检测CD-ROM,是否有光盘
GetMem(volname, 255);
GetMem(filesysname, 100);
for name :='C' to 'Z' do//循环检测A~Z
begin
drvname := name + ':';
CDtype := GetDriveType(PCHAR(@drvname[1])); //获得磁盘类型
if (CDtype = DRIVE_CDROM) then
begin
Memo2.Lines.Add('您的光驱盘符为[' + drvname + ']');
volname^ := Chr(0);
filesysname^ := Chr(0);
if ( not (GetVolumeInformation(PCHAR(@drvname[1]), volname, 250, LPDWORD(@sno), LPDWORD(@maxl)^, LPDWORD(@fileflag)^, filesysname,100))) then
Memo2.Lines.Add(drvname + '驱中没有发现光盘') //如果返回值为假
else //如果返回值为真
begin
Memo2.Lines.Add (drvname + '驱中光盘卷标为: [' + String(volname) + ']');
Memo2.Lines.Add (drvname + '驱中光盘序号为: [' + inttostr(sno) + ']');
end;
end;
end;
FreeMem(volname);
FreeMem(filesysname);
end;
windindance 2003-08-19
  • 打赏
  • 举报
回复
很有可能。
longint与integer一样,最多支持2^31-1,即2G。(现在谁还用2G的硬盘?)
使用Int64类型。

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧