|
こんにちは。
▼小僧 さん:
>Byte 型の変数をInteger型で宣言すると、実行してもエラーは起きませんが
>作成されるファイルが開けなくなってしまいます。
揚げ足をとるようでもうしわけありませんが、補足させてください。
問題はByte型のサイズは1バイトで、Integer型は2バイトだということです。
今回の事例は、BianryモードげGetしてそのままPutするわけで、
その意味ではInteger型でも問題はありません。
Integer型を使う2バイト単位で処理するので、
ファイルサイズが奇数バイトのときに対応できないことになります。
「バイト単位で処理するときはByte型」です。
Byte型は0〜255までの正の整数しか表現できないので、
他にはあまり使い道は多くありません。
現在のPCでは、それくらいのメモリをケチってもしょうがないですし、
32bitCPUというのは、32bit単位で処理する時が一番速度が出るもんだと
おもいますし。たぶん。
Sub sample()
Const maxbufsize As Long = 1024
Dim buf() As Integer
Dim filelen As Long, bufsize As Long
Dim FilenameR As String, FilenameW As String
Dim fnR As Integer, fnW As Integer
Dim i As Integer
FilenameR = Application.GetOpenFilename("*.pdf,*.pdf,*.xls,*.xls,*.doc,*.doc,*.txt,*.txt", 1, "コピーするファイルを指定してください。")
If FilenameR = "False" Then Exit Sub
i = InStrRev(FilenameR, "\")
FilenameW = Left(FilenameR, i) & "コピー" & Mid(FilenameR, i + 1)
fnR = FreeFile
Open FilenameR For Binary As fnR
fnW = FreeFile
Open FilenameW For Binary As fnW
filelen = LOF(fnR)
Do While filelen > 0
If filelen < maxbufsize Then
bufsize = filelen
If bufsize Mod 2 = 1 Then bufsize = bufsize + 1
'最後の1バイトをおとさないように。 このとき、よけいな1バイトが付加される
Else
bufsize = maxbufsize
End If
' ReDim buf(bufsize - 1) 'Byte型のとき
ReDim buf(bufsize \ 2 - 1) 'Ineger型のとき
Get fnR, , buf
Put fnW, , buf
filelen = filelen - bufsize
Loop
Close
End Sub
|
|