先日社内のストレージに問題があり、
外部のネットワークストレージはセキュリティを理由に使用不可
USBなどの外部媒体も使用禁止
メールの添付も10Mbの制限付き・・・
そんな時、大昔に大容量ファイルを分割し、複数のメールで添付して送付していた事を思い出し
使っていたファイルカットツールが欲しくなりました。
昔のソフトなので名前も覚えていない…
検索するとそのまま使えそうなソースコードが公開されていました。
VBの勉強もかねて
ソースを読み理解していきます。
参考サイト
http://tearspurelifestyle.blog102.fc2.com/?no=89#comment
参考元のソースを
読み解いて
test.binとなっている分割したいファイルをフォームから選べるように、OpenfileDialogを使い、
分割サイズをドロップダウンリストから選べるようにしました。
今後は出力ファイルのファイル名を自由にできるようにするとか色々できそうです。
Imports System
Imports System.IO
Class BinarySplit
Shared Sub cut()
' バイナリ・ファイルの読み込み
Dim src() As Byte = File.ReadAllBytes("test.bin")
' 分割サイズ指定
Dim FILESIZE As Integer = 1024 * 1000 ' 分割サイズ例 1MB
' カウンタ初期化
Dim num As Integer = 0
' 変数remainに分割元ファイルの長さを登録
Dim remain As Integer = src.Length
' 変数remainが0以上の間(ファイルが0バイトよりも残っている場合)ループ
While remain > 0
' 作成する分割ファイルの実際のサイズ
' FILESIZE と remeinどちらが大きいか(最終ループの為)
' 変数length = 切り取るバイト数となる
Dim length As Integer = Math.Min(FILESIZE, remain)
' 分割ファイルへ書き出すbyte配列の作成
Dim dest(length - 1) As Byte
' リファレンス
' Array.Copyメソッドでコピー
' Array.Copy(a, i, b, j, n)
' 配列aの(i+1)番目の要素を配列bの(j+1)番目の位置へと、順にn個をコピーする。
' 配列src(元ファイル)のnum*FILESIZE+1(カウンタ×分割サイズ+1)【切り出し開始】から
' 配列dest(分割ファイル書き出し配列)の0+1目の位置にlength個コピーする
Array.Copy(src, num * FILESIZE, dest, 0, length)
' 出力ファイル名指定(例out0001.bin、out0002.bin、……)
Dim name As String = String.Format("out{0:D4}.bin", num + 1)
' byte配列のファイルへの書き込み
File.WriteAllBytes(name, dest)
' カウントアップ
num += 1
' 変数remainから出力したファイルサイズを引く
remain -= FILESIZE
End While
End Sub
End Class
あと、
フォームの分割開始ボタンからサンプルのクラスを読み実行も成功しました。
分割後にMessageBox.Showを使って何個のファイルに分割できたのか表示できるようにしました。
分割したファイルはcopyコマンドで
copy /b out0001.bin + out0002.bin + ・・・out000x.bin test.bin
とすれば結合できます。