Option ExplicitPrivate Type ULARGE_INTEGER '这个可以自定义结构可以放很大的数据大小总和 LowPart As Long HighPart As Long End Type
Private Declare Function GetDiskFreeSpaceEx Lib "kernel32.dll" Alias "GetDiskFreeSpaceExA" _ (ByVal lpDirectoryName As String, _ lpFreeBytesAvailableToCaller As ULARGE_INTEGER, _ lpTotalNumberOfBytes As ULARGE_INTEGER, _ lpTotalNumberOfFreeBytes As ULARGE_INTEGER) As Long
Private Sub Command1_Click() Dim userbytes As ULARGE_INTEGER ' 目前 User 可用磁盘空间 Dim totalbytes As ULARGE_INTEGER ' 磁盘总空间 Dim freebytes As ULARGE_INTEGER ' 磁盘剩余总空间 Dim retval As Long ' GetDiskFreeSpaceEx 的返回值
If Text1.Text = "" Then Text1.Text = "C" retval = GetDiskFreeSpaceEx(Text1.Text & ":\", userbytes, totalbytes, freebytes) ' If userbytes.LowPart < 0 Then Me.Print "可用磁盘空间" & Format((userbytes.HighPart * (16 ^ 8)) + (userbytes.LowPart + (16 ^ 8)), "#,###") Else Me.Print "可用磁盘空间" & Format((userbytes.HighPart * (16 ^ 8)) + userbytes.LowPart, "#,###") End If ' If totalbytes.LowPart < 0 Then Me.Print "磁盘总空间" & Format((totalbytes.HighPart * (16 ^ 8)) + (totalbytes.LowPart + (16 ^ 8)), "#,###") Else Me.Print "磁盘总空间" & Format((totalbytes.HighPart * (16 ^ 8)) + totalbytes.LowPart, "#,###") End If ' If freebytes.LowPart < 0 Then Me.Print "磁盘剩余总空间" & Format((freebytes.HighPart * (16 ^ 8)) + (freebytes.LowPart + (16 ^ 8)), "#,###") Else Me.Print "磁盘剩余总空间" & Format((freebytes.HighPart * (16 ^ 8)) + freebytes.LowPart, "#,###") End If ' Text1.SelStart = 0 Text1.SelLength = Len(Text1) End Sub按照这个程序的设计原则,硬盘即使上几百G也可以完完全全的认不出来,那么我现在就想用这思想来累加我的文件大小总和,可是怎么才能应用上面的ULARGE_INTEGER呢,不会是: dim i as ULARGE_INTEGER i=filelen("d:\1.gho") i=i+filelen("d:\2.gho") ????????????????????????????
以前写过的一段模块 就是用String存放的~'=================================== '超长整数运算 'AprilSong '===================================Option Explicit'实际最大十进制位数=每段长度×段数,应设为大于实际用到的位数,以免溢出 Private Const LenPerS = 5 '每段长度,应保证最大项的平方不溢出 Private Const LenMaxS = 100 '段数,根据需要设置Private Const MaxN = 10 ^ LenPerS '每段进位数,各段值应与之取模,超出的数则进位'符号定义 Public Enum xSign Positive = 1 Negative = -1 End Enum'长数定义 Public Type xLongNum N(LenMaxS + 1) As Currency Sign As xSign '是否为正数 End Type'=================================== '值 '=================================== '赋值,将字符串S的值赋给X Public Sub SetLong(X As xLongNum, ByVal S As String) Dim i As Long Dim j As Long Dim tL As Long Dim tS As String '检查S合法性,限定为0~9的数和负号 If Left(S, 1) = "-" Then S = Mid(S, 2) X.Sign = Negative Else X.Sign = Positive End If tL = Len(S) For i = 1 To tL j = Asc(Mid$(S, i, 1)) If j < 48 Or j > 57 Then MsgBox "数据有误!", vbOKOnly, "长数赋值" Exit Sub End If Next '设置X值,按 LenPerS 分段赋值 j = 1 Do While tL > 0 tS = Right(S, LenPerS) X.N(j) = Val(tS)
j = j + 1 tL = Len(S) - LenPerS If tL > 0 Then S = Left(S, tL) Loop '清空其它位 For i = j To LenMaxS X.N(i) = 0 Next End Sub'取值,返回X对应的字符串 Public Function GetLong(X As xLongNum) As String Dim i As Long Dim j As Long Dim tL As Long Dim tS As String
For j = LenMaxS To 1 Step -1 If X.N(j) > 0 Then Exit For Next
If j < 1 Then GetLong = "0" Else tS = X.N(j) For i = j - 1 To 1 Step -1 tS = tS & Format(X.N(i), String(LenPerS, "0")) Next If X.Sign < Positive Then tS = "-" & tS GetLong = tS End If End Function'=================================== '功能函数 '=================================== '大小比较,是否A>B Public Function LongComp(A As xLongNum, B As xLongNum) As Boolean Dim i As Long
If A.Sign = B.Sign Then For i = LenMaxS To 1 Step -1 If A.N(i) <> B.N(i) Then Exit For Next If A.Sign = Positive Then LongComp = (A.N(i) > B.N(i)) Else LongComp = (A.N(i) < B.N(i)) End If Else If A.Sign > B.Sign Then LongComp = True Else LongComp = False End If End If End Function'求位数,返回X十进制位数 Public Function LongLen(X As xLongNum) As Long Dim i As Long Dim tS As String For i = LenMaxS To 1 Step -1 If X.N(i) > 0 Then LongLen = (i - 1) * LenPerS + Len(Trim(Str(X.N(i)))) Exit Function End If Next End Function'=================================== '基本运算 '=================================== '加法,返回 A + B Public Function LongAdd(A As xLongNum, B As xLongNum) As xLongNum Dim i As Long Dim tA As xLongNum Dim tB As xLongNum Dim rN As xLongNum
'初始化 tA = A tB = B For i = 1 To LenMaxS rN.N(i) = 0 Next rN.Sign = Positive
'分情况处理 If tA.Sign = tB.Sign Then '同号相加 For i = 1 To LenMaxS rN.N(i) = rN.N(i) + tA.N(i) + tB.N(i) '进位修正,加法中每段最多进1 If rN.N(i) >= MaxN Then rN.N(i) = rN.N(i) - MaxN rN.N(i + 1) = 1 End If rN.Sign = tA.Sign Next Else '异号相减 If tA.Sign > tB.Sign Then tB.Sign = Positive rN = LongSub(tA, tB) Else tA.Sign = Positive rN = LongSub(tB, tA) End If End If LongAdd = rN End Function'减法,返回 A - B Public Function LongSub(A As xLongNum, B As xLongNum) As xLongNum Dim i As Long Dim tA As xLongNum Dim tB As xLongNum Dim rN As xLongNum '初始化 tA = A tB = B For i = 1 To LenMaxS rN.N(i) = 0 Next rN.Sign = Positive
'分情况处理 If tA.Sign = tB.Sign Then '同号相减
'大数减小数为正,否则为负 If Not LongComp(tA, tB) Then rN.Sign = Negative Else rN.Sign = Positive End If '用绝对值大的减绝对值小的 tA.Sign = Positive tB.Sign = Positive If Not LongComp(tA, tB) Then tA = B tB = A End If For i = 1 To LenMaxS rN.N(i) = rN.N(i) + tA.N(i) - tB.N(i) '补位修正,减法中每段最多补1 If rN.N(i) < 0 Then rN.N(i) = rN.N(i) + MaxN rN.N(i + 1) = -1 End If Next Else '异号相加 tB.Sign = tA.Sign rN = LongAdd(tA, tB) End If LongSub = rN End Function'乘法,返回 A * B Public Function LongMult(A As xLongNum, B As xLongNum) As xLongNum Dim i As Long Dim j As Long Dim tA As xLongNum Dim tB As xLongNum Dim tC As xLongNum Dim rN As xLongNum
'初始化 tA = A tB = B tA.Sign = Positive tB.Sign = Positive rN = xZ '数值运算 For i = 1 To LenMaxS If tA.N(i) > 0 Then tC = xZ '归零 For j = 1 To LenMaxS tC.N(j) = tC.N(j) + tA.N(i) * tB.N(j) '逐段相乘 If tC.N(j) >= MaxN Then '进位修正 tC.N(j + 1) = Fix(tC.N(j) / MaxN) tC.N(j) = tC.N(j) - tC.N(j + 1) * MaxN End If Next tC = LongMov(tC, (i - 1) * LenPerS) '移项 rN = LongAdd(tC, rN) '累加 End If Next
LongMult = rN End Function'求模,返回 A Mod B,B 为负数时取绝对值 Public Function LongMod(A As xLongNum, B As xLongNum) As xLongNum Dim i As Long Dim lA As Long Dim lB As Long Dim tA As xLongNum Dim tB As xLongNum Dim tC As xLongNum Dim tM(1 To 9) As xLongNum
'初始化 tA = A tB = B lA = LongLen(tA) lB = LongLen(tB) tA.Sign = Positive '转正处理 tB.Sign = Positive tC.Sign = Positive For i = 1 To 9 tC.N(1) = i tM(i) = LongMult(tB, tC) Next
'高位消除 Do While lA >= lB For i = 9 To 1 Step -1 tC = LongMov(tM(i), lA - lB)
If Not LongComp(tC, tA) Then tA = LongSub(tA, tC) lA = LongLen(tA) Exit For End If If i = 1 Then lA = lA - 1 Next Loop
'符号修正 If A.Sign = Negative Then tA = LongSub(tB, tA)
LowPart As Long
HighPart As Long
End Type
Private Declare Function GetDiskFreeSpaceEx Lib "kernel32.dll" Alias "GetDiskFreeSpaceExA" _
(ByVal lpDirectoryName As String, _
lpFreeBytesAvailableToCaller As ULARGE_INTEGER, _
lpTotalNumberOfBytes As ULARGE_INTEGER, _
lpTotalNumberOfFreeBytes As ULARGE_INTEGER) As Long
Private Sub Command1_Click()
Dim userbytes As ULARGE_INTEGER ' 目前 User 可用磁盘空间
Dim totalbytes As ULARGE_INTEGER ' 磁盘总空间
Dim freebytes As ULARGE_INTEGER ' 磁盘剩余总空间
Dim retval As Long ' GetDiskFreeSpaceEx 的返回值
If Text1.Text = "" Then Text1.Text = "C"
retval = GetDiskFreeSpaceEx(Text1.Text & ":\", userbytes, totalbytes, freebytes)
'
If userbytes.LowPart < 0 Then
Me.Print "可用磁盘空间" & Format((userbytes.HighPart * (16 ^ 8)) + (userbytes.LowPart + (16 ^ 8)), "#,###")
Else
Me.Print "可用磁盘空间" & Format((userbytes.HighPart * (16 ^ 8)) + userbytes.LowPart, "#,###")
End If
'
If totalbytes.LowPart < 0 Then
Me.Print "磁盘总空间" & Format((totalbytes.HighPart * (16 ^ 8)) + (totalbytes.LowPart + (16 ^ 8)), "#,###")
Else
Me.Print "磁盘总空间" & Format((totalbytes.HighPart * (16 ^ 8)) + totalbytes.LowPart, "#,###")
End If
'
If freebytes.LowPart < 0 Then
Me.Print "磁盘剩余总空间" & Format((freebytes.HighPart * (16 ^ 8)) + (freebytes.LowPart + (16 ^ 8)), "#,###")
Else
Me.Print "磁盘剩余总空间" & Format((freebytes.HighPart * (16 ^ 8)) + freebytes.LowPart, "#,###")
End If
'
Text1.SelStart = 0
Text1.SelLength = Len(Text1)
End Sub按照这个程序的设计原则,硬盘即使上几百G也可以完完全全的认不出来,那么我现在就想用这思想来累加我的文件大小总和,可是怎么才能应用上面的ULARGE_INTEGER呢,不会是:
dim i as ULARGE_INTEGER
i=filelen("d:\1.gho")
i=i+filelen("d:\2.gho")
????????????????????????????
只是做进度条的话……
精确到小数点后三位也就可以让进度一个象素一个象素的走了文件多的时候单位用KB或者用M就可以了吧
没必要这么精确吧~
不然就用string满足了吧.分段截取.
其实不可能用得到那么大,至少用0.1M做单位.
就是用String存放的~'===================================
'超长整数运算
'AprilSong
'===================================Option Explicit'实际最大十进制位数=每段长度×段数,应设为大于实际用到的位数,以免溢出
Private Const LenPerS = 5 '每段长度,应保证最大项的平方不溢出
Private Const LenMaxS = 100 '段数,根据需要设置Private Const MaxN = 10 ^ LenPerS '每段进位数,各段值应与之取模,超出的数则进位'符号定义
Public Enum xSign
Positive = 1
Negative = -1
End Enum'长数定义
Public Type xLongNum
N(LenMaxS + 1) As Currency
Sign As xSign '是否为正数
End Type'===================================
'值
'===================================
'赋值,将字符串S的值赋给X
Public Sub SetLong(X As xLongNum, ByVal S As String)
Dim i As Long
Dim j As Long
Dim tL As Long
Dim tS As String '检查S合法性,限定为0~9的数和负号
If Left(S, 1) = "-" Then
S = Mid(S, 2)
X.Sign = Negative
Else
X.Sign = Positive
End If tL = Len(S)
For i = 1 To tL
j = Asc(Mid$(S, i, 1))
If j < 48 Or j > 57 Then
MsgBox "数据有误!", vbOKOnly, "长数赋值"
Exit Sub
End If
Next '设置X值,按 LenPerS 分段赋值
j = 1
Do While tL > 0
tS = Right(S, LenPerS)
X.N(j) = Val(tS)
j = j + 1
tL = Len(S) - LenPerS
If tL > 0 Then S = Left(S, tL)
Loop '清空其它位
For i = j To LenMaxS
X.N(i) = 0
Next
End Sub'取值,返回X对应的字符串
Public Function GetLong(X As xLongNum) As String
Dim i As Long
Dim j As Long
Dim tL As Long
Dim tS As String
For j = LenMaxS To 1 Step -1
If X.N(j) > 0 Then Exit For
Next
If j < 1 Then
GetLong = "0"
Else
tS = X.N(j)
For i = j - 1 To 1 Step -1
tS = tS & Format(X.N(i), String(LenPerS, "0"))
Next
If X.Sign < Positive Then tS = "-" & tS
GetLong = tS
End If
End Function'===================================
'功能函数
'===================================
'大小比较,是否A>B
Public Function LongComp(A As xLongNum, B As xLongNum) As Boolean
Dim i As Long
If A.Sign = B.Sign Then
For i = LenMaxS To 1 Step -1
If A.N(i) <> B.N(i) Then Exit For
Next
If A.Sign = Positive Then
LongComp = (A.N(i) > B.N(i))
Else
LongComp = (A.N(i) < B.N(i))
End If
Else
If A.Sign > B.Sign Then
LongComp = True
Else
LongComp = False
End If
End If
End Function'求位数,返回X十进制位数
Public Function LongLen(X As xLongNum) As Long
Dim i As Long
Dim tS As String For i = LenMaxS To 1 Step -1
If X.N(i) > 0 Then
LongLen = (i - 1) * LenPerS + Len(Trim(Str(X.N(i))))
Exit Function
End If
Next
End Function'===================================
'基本运算
'===================================
'加法,返回 A + B
Public Function LongAdd(A As xLongNum, B As xLongNum) As xLongNum
Dim i As Long
Dim tA As xLongNum
Dim tB As xLongNum
Dim rN As xLongNum
'初始化
tA = A
tB = B
For i = 1 To LenMaxS
rN.N(i) = 0
Next
rN.Sign = Positive
'分情况处理
If tA.Sign = tB.Sign Then
'同号相加
For i = 1 To LenMaxS
rN.N(i) = rN.N(i) + tA.N(i) + tB.N(i)
'进位修正,加法中每段最多进1
If rN.N(i) >= MaxN Then
rN.N(i) = rN.N(i) - MaxN
rN.N(i + 1) = 1
End If
rN.Sign = tA.Sign
Next
Else
'异号相减
If tA.Sign > tB.Sign Then
tB.Sign = Positive
rN = LongSub(tA, tB)
Else
tA.Sign = Positive
rN = LongSub(tB, tA)
End If
End If
LongAdd = rN
End Function'减法,返回 A - B
Public Function LongSub(A As xLongNum, B As xLongNum) As xLongNum
Dim i As Long
Dim tA As xLongNum
Dim tB As xLongNum
Dim rN As xLongNum '初始化
tA = A
tB = B
For i = 1 To LenMaxS
rN.N(i) = 0
Next
rN.Sign = Positive
'分情况处理
If tA.Sign = tB.Sign Then
'同号相减
'大数减小数为正,否则为负
If Not LongComp(tA, tB) Then
rN.Sign = Negative
Else
rN.Sign = Positive
End If
'用绝对值大的减绝对值小的
tA.Sign = Positive
tB.Sign = Positive
If Not LongComp(tA, tB) Then
tA = B
tB = A
End If For i = 1 To LenMaxS
rN.N(i) = rN.N(i) + tA.N(i) - tB.N(i)
'补位修正,减法中每段最多补1
If rN.N(i) < 0 Then
rN.N(i) = rN.N(i) + MaxN
rN.N(i + 1) = -1
End If
Next
Else
'异号相加
tB.Sign = tA.Sign
rN = LongAdd(tA, tB)
End If LongSub = rN
End Function'乘法,返回 A * B
Public Function LongMult(A As xLongNum, B As xLongNum) As xLongNum
Dim i As Long
Dim j As Long
Dim tA As xLongNum
Dim tB As xLongNum
Dim tC As xLongNum
Dim rN As xLongNum
'初始化
tA = A
tB = B
tA.Sign = Positive
tB.Sign = Positive
rN = xZ '数值运算
For i = 1 To LenMaxS
If tA.N(i) > 0 Then
tC = xZ '归零
For j = 1 To LenMaxS
tC.N(j) = tC.N(j) + tA.N(i) * tB.N(j) '逐段相乘
If tC.N(j) >= MaxN Then '进位修正
tC.N(j + 1) = Fix(tC.N(j) / MaxN)
tC.N(j) = tC.N(j) - tC.N(j + 1) * MaxN
End If
Next
tC = LongMov(tC, (i - 1) * LenPerS) '移项
rN = LongAdd(tC, rN) '累加
End If
Next
'异号为负
rN.Sign = IIf(A.Sign = B.Sign, Positive, Negative)
LongMult = rN
End Function'求模,返回 A Mod B,B 为负数时取绝对值
Public Function LongMod(A As xLongNum, B As xLongNum) As xLongNum
Dim i As Long
Dim lA As Long
Dim lB As Long
Dim tA As xLongNum
Dim tB As xLongNum
Dim tC As xLongNum
Dim tM(1 To 9) As xLongNum
'初始化
tA = A
tB = B
lA = LongLen(tA)
lB = LongLen(tB)
tA.Sign = Positive '转正处理
tB.Sign = Positive
tC.Sign = Positive
For i = 1 To 9
tC.N(1) = i
tM(i) = LongMult(tB, tC)
Next
'高位消除
Do While lA >= lB
For i = 9 To 1 Step -1
tC = LongMov(tM(i), lA - lB)
If Not LongComp(tC, tA) Then
tA = LongSub(tA, tC)
lA = LongLen(tA)
Exit For
End If
If i = 1 Then lA = lA - 1
Next
Loop
'符号修正
If A.Sign = Negative Then tA = LongSub(tB, tA)
LongMod = tA
End Function