SAK 図書館
VB テクニック編32 - ファイル分割・統合、バイナリファイル I/O
■SAK 関数利用規程
・テクニック編で紹介する関数は、私こと Y.SAK の開発関数である。
・著作権明示部分の改編は認めない。
・個人、企業がこれらの関数を使用したり、一部を使用して新たなシステムや
プログラムを開発することは自由です。
・但し、これらの関数を一部でも使用しているソフトウェアをシェアウェア、
その他有償プロダクトとして配布・販売するには、私の許可が必要です。
(無償のフリーソフトウェアなら、自由に配布しても良い。)
・これらの関数を使用して発生した、いかなる形での損害も私こと Y.SAK は
賠償しません。
■ファイル分割・統合、バイナリファイル I/O
・フロッピーやメール容量を超えるファイルを分割するには、次のようにする。
分割ファイルの拡張子は .001 〜 .999 となる。
CnvMltVol 関数を呼ぶ場合、分割ファイルの拡張子は .001 固定で良い。
分割サイズは FPD の場合、1440000 bytes である。
32000 bytes 未満を指定することはできない。
また、高速処理のために、実分割サイズは 32000 の倍数になる。
(指定分割サイズを超えることはない。)
If CnvMltVol("g:\tmp\schtbl.lzh", "g:\tmp\schtbl_lzh.001", 1440000) = False Then
msgbox "ファイル分割エラー"
Exit Sub
End If
・分割ファイルをオリジナルファイルに統合する場合、次のようにする。
分割ファイルの拡張子は .001 〜 .999 である。
CnvSglVol 関数を呼ぶ場合、分割ファイルの拡張子は .001 固定で良い。
If CnvSglVol("g:\tmp\schtbl_lzh.001", "g:\tmp\schtbl.lzh") = False Then
msgbox "ファイル統合エラー"
Exit Sub
End If
・手動統合方法 - 手作業でファイル統合するには、コマンドプロンプトから、
copy a:\schtbl_lzh.001 g:\tmp\ ← 001 のフロッピーをセットしてから
copy a:\schtbl_lzh.002 g:\tmp\ ← 002 のフロッピーに入れ換えてから
copy a:\schtbl_lzh.??? g:\tmp\ ← ??? のフロッピーに入れ換えてから
g:
cd \tmp
copy schtbl_lzh.001 /b + schtbl_lzh.002 /b + schtbl_lzh.??? /b schtbl.lzh
とすることによって、統合可能である。
'=======================================================================
' マルチボリューム分割
'=======================================================================
'【引数】
' infnm = 入力ファイル名
' outfnm = 出力ファイル名
' outsize = ファイル分割サイズ
'【戻り値】
' boolean
' TRUE 正常
' FALSE エラー
'【処理】
' ・入力ファイルを指定された容量に分割する。
'【著作権】
' CnvMltVol ver 2.00 Copyright (C) 1999-2002 Y.SAK
'【履歴】
' 1999.01.27 sak ver 1.00 新規作成
' 2002.04.07 sak ver 2.00 VB6 コンバート
'=======================================================================
Public Function CnvMltVol(infnm As String, outfnm As String, outsize As Long) As Boolean
Dim i As Long
Dim fnm As String
Dim fno As Long
Dim fno1 As Long
Dim filesize As Long
Dim writesize As Long
Dim l As Long
Dim seqno As Long
'** 異常終了セット
CnvMltVol = False
'** 分割サイズチェック
If outsize < 32000 Then
MsgBox "分割サイズが 32000 未満です。" + Chr(10) + "32000 以上を指定して下さい。", 48, "CnvMltVol()"
Exit Function
End If
'** 入力ファイルオープン
On Local Error Resume Next
fno = FreeFile
Open infnm For Input As fno Len = 32000
If Err <> 0 Then
MsgBox "入力ファイルのオープンに失敗しました。" + Chr(10) + " for input infnm = " + infnm, 48, "CnvMltVol()"
Exit Function
End If
Close fno
Err = 0
fno = FreeFile
Open infnm For Binary As fno Len = 32000
If Err <> 0 Then
MsgBox "入力ファイルのオープンに失敗しました。" + Chr(10) + "for binary infnm = " + infnm, 48, "CnvMltVol()"
Exit Function
End If
'** 分割処理
i = InStrRev(outfnm, ".")
If i = 0 Then Exit Function
fnm = Left(outfnm, i - 1)
seqno = 1
fno1 = OpenMltFile(fnm, seqno, False)
If fno1 = False Then
Close fno
Exit Function
End If
filesize = LOF(fno)
writesize = 0
Do Until filesize < 1
l = filesize
If l > 32000 Then l = 32000
ReDim rec(l - 1) As Byte
Get fno, , rec
If writesize + l > outsize Then
Close fno1
seqno = seqno + 1
fno1 = OpenMltFile(fnm, seqno, False)
If fno1 = False Then
Close fno
Exit Function
End If
writesize = 0
End If
Put fno1, , rec
writesize = writesize + l
filesize = filesize - l
Loop
'** ファイルクローズ
Close fno1
Close fno
On Local Error GoTo 0
'** 正常終了セット
CnvMltVol = True
End Function
'=======================================================================
' マルチボリューム統合
'=======================================================================
'【引数】
' infnm = 入力ファイル名
' outfnm = 出力ファイル名
'【戻り値】
' boolean
' TRUE 正常
' FALSE エラー
'【処理】
' ・分割ファイルを統合する。
'【著作権】
' CnvSglVol ver 2.00 Copyright (C) 1999-2002 Y.SAK
'【履歴】
' 1999.01.27 sak ver 1.00 新規作成
' 2002.04.07 sak ver 2.00 VB6 コンバート
'=======================================================================
Public Function CnvSglVol(infnm As String, outfnm As String) As Boolean
Dim i As Long
Dim fnm As String
Dim fno As Long
Dim fno1 As Long
Dim filesize As Long
Dim l As Long
Dim seqno As Long
'** 異常終了セット
CnvSglVol = False
'** 統合処理
i = InStrRev(infnm, ".")
If i = 0 Then Exit Function
fnm = Left(infnm, i - 1)
seqno = 1
fno = OpenMltFile(fnm, seqno, True)
If fno = False Then
MsgBox "分割ファイルが見つかりません。" + Chr(10) + "infnm = " + infnm, 48, "CnvSglVol()"
Exit Function
End If
On Local Error Resume Next
fno1 = FreeFile
Open outfnm For Binary As fno1 Len = 32000
If Err <> 0 Then
Close fno
MsgBox "統合ファイルのオープンに失敗しました。" + Chr(10) + "outfnm = " + outfnm, 48, "CnvSglVol()"
Exit Function
End If
Do
filesize = LOF(fno)
Do Until filesize < 1
l = filesize
If l > 32000 Then l = 32000
ReDim rec(l - 1) As Byte
Get fno, , rec
Put fno1, , rec
filesize = filesize - l
Loop
Close fno
seqno = seqno + 1
fno = OpenMltFile(fnm, seqno, True)
Loop Until fno = False
'** ファイルクローズ
Close fno1
Close fno
Close
On Local Error GoTo 0
'** 正常終了セット
CnvSglVol = True
End Function
'=======================================================================
' 分割ファイルオープン
'=======================================================================
'【引数】
' outfnm = オープンファイル名
' no = シリアル No.
' chk = 存在チェックする(TRUE)、しない(FALSE)
'【戻り値】
' long = ファイル No.
' = 0 エラー
'【処理】
' ・入力ファイルを指定された容量に分割する。
'【著作権】
' OpenMltFile ver 2.00 Copyright (C) 1999-2002 Y.SAK
'【履歴】
' 1999.01.27 sak ver 1.00 新規作成
' 2002.04.07 sak ver 2.00 VB6 コンバート
'=======================================================================
Public Function OpenMltFile(outfnm As String, no As Long, chk As Boolean) As Long
Dim fnm As String
Dim fno As Long
'** 異常終了セット
OpenMltFile = False
'** 分割ファイルオープン
If no > 999 Then
MsgBox "分割ファイルが 999 を越えました。" + Chr(10) + "outfnm = " + outfnm, 48, "OpenMltFile()"
Exit Function
End If
fnm = outfnm + "." + Right("000" + LTrim(Str(no)), 3)
On Local Error Resume Next
If chk = True Then
fno = FreeFile
Open fnm For Input As fno Len = 32000
If Err <> 0 Then Exit Function
Close fno
End If
fno = FreeFile
Open fnm For Binary As fno Len = 32000
If Err <> 0 Then
MsgBox "分割ファイルのオープンに失敗しました。" + Chr(10) + "fnm = " + fnm, 48, "OpenMltFile()"
Exit Function
End If
'** 正常終了セット
OpenMltFile = fno
End Function
■VB テクニック編資料
■VB 入門編資料
■VB 基礎編資料
■VB ビジュアル編資料