如何在程序中检测大硬盘的容量?(50分)

  • 主题发起人 主题发起人 liukt
  • 开始时间 开始时间
L

liukt

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大仙:
在下又有一个问题求教:我想使用diskfree()和disksize()检测硬盘
容量和可用空间,程序如下(delphi3):
var
V_IFree,V_Isize:longint;
begin
V_IFree:=diskfree(3) div 1024;
V_Isize:=disksize(3) div 1024;
showmessage(inttostr(V_IFree)+' '+intostr(V_Isize));
end;
运行结果是,这两个函数检测的最大值只能是 2G左右,而我用的是 4G 硬盘,请问这程序该怎样改?(以上程序用于检测 A:时结果正确。)
 
用 delphi4, 定义v_ifree...为int64, 可以运行:-)
 
对!
YouSelf的源代码也有这种错,
取磁盘大小的变量定义为Integer,
结果碰到太大的硬盘就显示为负数,
让我在客户面前羞得半死,

于是跟跟跟,改改改,改成Int64搞定,
可预期的将来,应该不会有这么大的硬盘吧?
 
多谢各位!我现在用的是Delphi3,在Delphi3下是否绝对没有办法了?如果确实
没办法,我就要发分了。
 
试试currency, 记得是64位的.
 
DELPHI3中有叫“COMP”的类型,是64位的整数,以下摘自DELPHI3的HELP

The Comp (computational) type is a 64-bit integer that holds integral values from
-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 (-263 to 263-1).

但是我觉得不一定行,因为DISKSIZE返回的是INT型。
 
yck:强制转换呢?

用API:
<font color=red>unit Windows
function GetDiskFreeSpace(
lpRootPathName: PChar;
var lpSectorsPerCluster,
lpBytesPerSector,
lpNumberOfFreeClusters,
lpTotalNumberOfClusters: DWORD): BOOL
stdcall;</font>

输入:<B>pRootPathName</B>:磁盘根目录,如果为Nil,取当前磁盘
输出:
<B>lpSectorsPerCluster</B>:每簇扇区数
<B>lpBytesPerSector</B>:每扇区字节数
<B>lpNumberOfFreeClusters</B>:磁盘空闲簇数
<B>lpTotalNumberOfClusters</B>:磁盘总簇数

然后乘一下就可以了,


好麻烦啊,升级吧!
 
蚯蚓好厉害!
 
用GetDiskFreeSpaceEx 更好
 
麻烦各位了!问题仍然没有解决,
蚯蚓:使用API方法在Delphi3下仍然不行,即使定义为Dword类型,仍然是只能查到2G。
cytom &amp
yck: 使用 currency 和 comp 类型都可以运算,但我现在还没有找到把
结果转换为String显示出来的方法(用writerCurrency()之类不行),不知二位
能否再指点一下(我已在Unit 中加入了regist)?
WWW:使用GetDiskSpaceEx('c:/',V_I_VFree,V_I_TNuBytes,V_PI_TNuFree) 在
大硬盘时得出的是负值。
 
一个比较土一点的解决办法,
将COMP数据一次次地减2G,直至其小于2G。
 
我用currency没问题呀?
var a,b:currency;
begin
a:=diskfree(5) div 1024;
b:=disksize(5) div 1024;
showmessage(CurrToStr(a)+' '+CurrToStr(b));
end;

如果d3没有currtostr函数, 下面是原码.


function CurrToStr(Value: Currency): string;
var
Buffer: array[0..63] of Char;
begin
SetString(Result, Buffer, FloatToText(Buffer, Value, fvCurrency,
ffGeneral, 0, 0));
end;
 
cytom: 再次谢您。
但我按您写的程序用Currency类型运行时,4G硬盘仍然只能报出2G(2,096,832KB).
不知为何?我看您检测的是(5),显然是您的 E:。不知您的E:分了多大容量?
 
e分了5.2G:-)
请检查一下currtostr函数在d3中是否和我写在上面的一样, 如果不一样, 用我的代替.
 
cytom: 我用您的currtostr函数代替, 4G硬盘仍然只能报出2G(2,096,832KB).不知
为何 .现在我已经决定升级到D4了,不用再为此费尽心机,再次谢您。

各位:没想到这个问题这么费劲,出的分太少了。由于这个论坛无法临时再加分,只
好向各位道歉了。再次谢谢大家的关照!
 

<font size=15><B>唉!离题万里!</B></font>

这个问题本身不成问题,关键在于D3的整数类型太小,
所以DiskFree函数本身的返回值就错了,
你们在这个错误的值基础上再怎么搞也是错的

用API的方法绝对可以搞定,因为上面那个API返回的不是一个巨大的乘积
而是簇数<font color=red>(C)</font>、扇区数/簇<font color=red>(S)</font>和字节数/扇区<font color=red>(B)</font>
如果你要的是以M为单位,计算方法是:

Result:=C*S*B/(1024*1024)

现在的问题是C*S*B太大,超过了D3的整数范围,

那么,我们这样来算:
Temp1:=C/1024
// 硬盘的C肯定大于1024吧?
Temp2:=B/1024
// 硬盘的B肯定大于1024吧?
Result:=Temp1*Temp2*S
// 单位为MB

这样的结果,肯定不会超过D3的整数表达范围,
32位整数,在正负2^31之间,等于2*1024*1024*1024,
即二百万G容量,可预见的将来,应该没这么大的硬盘吧?


说了这么多,其实一点意义都没有,纯粹是Delphi版本太低,
<font color=red>升级吧!!!!</font>
 
后退
顶部