现在有一问题难倒我了,我要写一个复制文件夹的程序,也就是下面有文件又有子文件夹,但我要写带有进度条的界面呀,继然要写进度条,就说明先要取得文件夹下所有的文件大小的总和,按以前的老方法就是设置一个长整型变量Long,可是long型最大只能认2147483647(也就是2G),但我的一个文件下的所有文件有可能不只是2G呀,那么此时应怎么怎么做呢,能否告诉我方法?

解决方案 »

  1.   

    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")
    ????????????????????????????
      

  2.   

    现在一般的屏幕宽度也只有1024
    只是做进度条的话……
    精确到小数点后三位也就可以让进度一个象素一个象素的走了文件多的时候单位用KB或者用M就可以了吧
    没必要这么精确吧~
      

  3.   

    Currency 够不够.
    不然就用string满足了吧.分段截取.
    其实不可能用得到那么大,至少用0.1M做单位.
      

  4.   

    分段可以设呀,关键是所有文件大小的总和用什么变量来存呢,按楼上所说,用String/curency? 这样从效力和运行速度上来讲,是否是最完美的选择,如没有好的办法,那么请问,String这个东西怎么存放长整型变量呢,怎么参加运算呢
      

  5.   

    以前写过的一段模块
    就是用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
      

  6.   

    you are better wait for 64 bits windows