« VBAで正規表現を使用する | メイン | 動画を再生する »

ファイルを分割・復元する

ファイル分割をしてみました。
ThisWorkbook.Pathを使用するので
サンプルマクロを貼り付けて、一旦エクセルを保存してください。

このマクロを実行するエクセルと同じパスにあるmoto.lzhというファイルを、
約1Mバイトごとに、test0001、test0002....というファイルに分割します。

コメントを入れているのでわかると思いますが、ポイントは2点。
1.Openする際にBinary Accessモードを使用
2.読込むエリアはbyte型で定義
いずれも、テキスト以外のファイルを扱うための工夫です。


Sub ファイル分割()

Dim fileA As String
Dim fileB As String
Dim fileC As String

'分割元ファイル
fileA = ThisWorkbook.Path & "¥moto.lzh"
'分割後ファイル(末尾に通番を付与する)
fileB = ThisWorkbook.Path & "¥test"
'復元用バッチファイル
fileC = ThisWorkbook.Path & "¥recov.bat"

'分割数
Dim ix As Integer
'分割長
Dim ln As Long
'インプットエリア
Dim ReadArea() As Byte
'元ファイル長
Dim TotalLen As Long
'終了フラグ
Dim Last As Boolean
'バッチファイルの内容
Dim Bat As String

'全体長セット
TotalLen = FileLen(fileA)

'分割長セット(1Mバイト)
ln = 1000000

'元ファイルオープン
Open fileA For Binary Access Read As #1

'分割数初期値化
ix = 1

  P_loop:

'分割長セット(TotalLenは残りバイト数を保持)
'最後がぴったりだと駄目かも
If TotalLen > ln Then
TotalLen = TotalLen - ln
Else
ln = TotalLen
Last = True
End If

'読込みエリア確保
ReDim ReadArea(1 To ln)

'読込み
Get #1, , ReadArea

'分割ファイル作成
Open fileB & Format(ix, "0000") For Binary Access Write As #2
Put #2, , ReadArea
Close #2

'バッチファイルの内容を作成
If ix = 1 Then
Bat = "copy /b " & "test" & Format(ix, "0000")
Else
Bat = Bat & " + " & "test" & Format(ix, "0000")
End If

'終了処理
If Last Then

Close #1

Bat = Bat & " recov.lzh"
Open fileC For Output As #1
Print #1, Bat
Close #1

Exit Sub

End If

'ループ処理
ix = ix + 1
GoTo P_loop

End Sub

バッチファイルはコピー命令の結合を使用しています。
copy /b test0001 + test0002 + ..... recov.lzhというコマンドですが、
分割数が多いと、コマンドの実行ができません。
copy /b test* recov.hzhとワイルドカードでもできますが、
復元用にマクロを作成しました。


Sub ファイル結合()
Dim fileA As String
Dim fileB As String
Dim Last As Boolean

fileA = ThisWorkbook.Path & "¥recov.lzh"
fileB = ThisWorkbook.Path & "¥test"

Dim ix As Integer
Dim ln As Long
Dim ReadArea() As Byte

TotalLen = FileLen(ThisWorkbook.Path & "¥moto.lzh")
ln = 1000000

Open fileA For Binary Access Write As #1

ix = 1

P_loop:

If TotalLen > ln Then
TotalLen = TotalLen - ln
Else
ln = TotalLen
Last = True
End If

ReDim ReadArea(1 To ln)

Open fileB & Format(ix, "0000") For Binary Access Read As #2

Get #2, , ReadArea

Put #1, , ReadArea

Close #2

If Last Then
Close #1
Exit Sub
End If

ix = ix + 1
GoTo P_loop

End Sub

こちらはコメントを入れていませんが、はじめの分割ファイルを復元します。
ファイルの分割⇒復元のアプリを作るには、
復元時に必要な下記の項目を保存しておく必要があります。

元ファイル名   少なくとも、拡張子はあったほうがよいです。復元しても何のファイルかわからないんじゃね。。
元ファイル長   読み書きするバッファーで長さを把握していますが、これがないとキチンと結合できません。
分割ファイル名  分割のさせ方にもよりますが、この場合通番以外の名称が必要です
分割ファイル長  読み書きするバッファーの省略時値になります。これも必須

ひとつ前の投稿は「VBAで正規表現を使用する」です。
次の投稿は「動画を再生する」です。

トラックバック

このエントリーのトラックバックURL:
http://www.xillion.net/mova/mt-tb.cgi/81

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

About

2005年04月10日 00:00に投稿されたエントリーのページです。

メインページアーカイブページも見てください。

Powered by
Movable Type 3.34