查看完整版本: 文件读写(一个奇怪的现象????)

只爱陌生人 2006-10-26 15:44

文件读写(一个奇怪的现象????)

[code]Option Explicit
Public Sub splitFile(ByVal socfile As String, ByVal objfile As String, ByVal parts As Integer)
Dim socNo As Integer, objNo As Integer
Dim basePartLen As Long, leftPartLen As Long
Dim miniLoopTime As Long, miniLeft As Long
Dim temp() As Byte
Dim i As Integer, j As Integer
If parts < 2 Then
    MsgBox "份数应在2份以上!", vbOKOnly + vbInformation, "提示"
    Exit Sub
End If
basePartLen = FileLen(socfile) \ parts
leftPartLen = FileLen(socfile) Mod parts
Debug.Print FileLen(socfile) & "=   " & basePartLen * parts & " +" & leftPartLen
If basePartLen < 1024 * 5 * 3 Then                  
    miniLoopTime = 0
    miniLeft = 0
Else
    miniLoopTime = basePartLen \ (1024 * 5)
    miniLeft = basePartLen Mod (1024 * 5)
End If
Debug.Print basePartLen & "=  " & miniLoopTime * 1024 * 5 & "+" & miniLeft
socNo = FreeFile
Open socfile For Binary As socNo
For i = 1 To parts - 1
    objNo = FreeFile
    Open objfile & i For Binary As objNo
        If miniLoopTime = 0 Then
            ReDim temp(basePartLen) As Byte
            Get socNo, , temp
            Put objNo, , temp
        Else
            ReDim temp(1024 * 5) As Byte
            For j = 1 To miniLoopTime
                Get socNo, , temp
                Put objNo, , temp
            Next j
            ReDim temp(miniLeft) As Byte        
            Get socNo, , temp
            Put objNo, , temp
        End If
    Close objNo
Next i
objNo = FreeFile
Open objfile & parts For Binary As objNo
    If miniLoopTime = 0 Then
        ReDim temp(basePartLen + leftPartLen) As Byte
        Get socNo, , temp
        Put objNo, , temp
    Else
        ReDim temp(1024 * 5) As Byte
        For j = 1 To miniLoopTime
            Get socNo, , temp
            Put objNo, , temp
        Next j
        ReDim temp(miniLeft + leftPartLen) As Byte      
        Get socNo, , temp
        Put objNo, , temp
    End If
Close objNo
Close socNo   
End Sub[/code]
如果把其中的
If basePartLen < 1024 * 5 * 3 Then                  
    miniLoopTime = 0
    miniLeft = 0
Else
    miniLoopTime = basePartLen \ (1024 * 5)
    miniLeft = basePartLen Mod (1024 * 5)
End If
改为
If basePartLen < 1024 * 2 * 3 Then                  
    miniLoopTime = 0
    miniLeft = 0
Else
    miniLoopTime = basePartLen \ (1024 *2)
    miniLeft = basePartLen Mod (1024 * 2)
End If
或者相应地改为(1024*n), 且在后面的redim temp(1024*5) as byte里面作相当地改动,发现:n越大,分割后得到的文件复原后与原文件大小越接近???!!!(我在测试时都是复原后比原文件大)
本来可以只要redim temp(basepartlen) as byte就行,但是不好得到文件读写进度.
我是为了在分割时更准确地知道处理进度的(并用进度条显示出来)。

[[i] 本帖最后由 只爱陌生人 于 2006-10-26 15:52 编辑 [/i]]

Nothing 2006-10-26 20:41

这样肯定不行,不要老想关1024,到最后的时候,你必须计算字节数
下面代码供你参考
[code]
    Dim aa() As Byte
    Open "c:\1.txt" For Binary As #1
    alen = LOF(1)
    b = alen Mod 1024
    Open "c:\2.txt" For Binary As #2
    i = alen
    Do While i > 0
        If i < 1024 Then
            ReDim aa(i)
            i = 0
        Else
            i = i - 1024
            ReDim aa(1024)
        End If
        Get #1, , aa
        Put #2, , aa
    Loop
    Close #2
    Close #1
   
   
   
[/code]

只爱陌生人 2006-10-28 10:39

还真TMD邪了??

在我这台电脑上, 连下面这段代码都运行不正确??!!
[code]Private Sub Command1_Click()
Dim temp() As Byte
Open "c:\1.txt" For Binary As #1
ReDim temp(LOF(1)) As Byte
Open "c:\2.txt" For Binary As #2
Get #1, , temp
Put #2, , temp
Close#2
Close #1
Debug.Print "filished......."
end sub[/code]
2.txt总比1.txt多出一字节???用其它类型文件也是如此!!!

[[i] 本帖最后由 只爱陌生人 于 2006-10-28 10:43 编辑 [/i]]

Nothing 2006-10-28 10:58

这样试试
ReDim temp(LOF(1)-1) As Byte

只爱陌生人 2006-10-28 12:25

redim(temp(lof(1)-1) as byte可以是可以,但是
这没道理呀,怎么解释呢???搞不懂!?

Nothing 2006-10-28 17:38


比如你有1024个字节
redim a(1024) 实际上数组a实际上是有1025个,因为第一个是a(0),最后一个是a(1024)
页: [1]
查看完整版本: 文件读写(一个奇怪的现象????)