DOBON.NET DOBON.NETプログラミング掲示板過去ログ

バイナリファイルの結合処理

環境/言語:[VB.NET 2008]
分類:[.NET]

開発環境:VB.NET2008

バイナリファイルを連続で連結するプログラムを作成しています。

MSDOSでの結合よりもファイルストリームを使用したプログラムの方が処理が早いようなのでファイルストリームで作成してみました。

結合ターゲットファイル名は「test.001 test.002 test.003」のように拡張子が数字になっています。

もう少しスマートなプログラムが作成出来そうなのですがアドバイス頂けると助かります。
結合ファイルのサイズが大きいので処理速度が速くなりそうなアドバイスも頂けると非常に助かります。
(ファイルも二桁以上になると今のプログラムでは処理出来ませんね・・・)

処理内容:指定したフォルダ内のファイル全てを順番に結合する。


--以下プログラム--

Shared Sub JOIN()

Dim intCnt As Integer
Dim strDIR As String = "C:\join"

For Each strFilePath As String In _
System.IO.Directory.GetFiles(strDIR, _
"*", IO.SearchOption.AllDirectories)
intCnt += 1
Next

Console.WriteLine(intCnt)


Dim count As Integer = 1

Do While count < intCnt + 1

'Dim data As Byte() = System.IO.File.ReadAllBytes("C:\join\test.00" & count)
'My.Computer.FileSystem.WriteAllBytes _
'("C:\join\join.ok", data, True)
Console.WriteLine(count)

count += 1
Loop

End Sub

--プログラム終了--

上記が初めてながら作ってみたお粗末なプログラムです。
宜しくお願い致します。
■No26524に返信(tstyleさんの記事)
> 結合ターゲットファイル名は「test.001 test.002 test.003」のように拡張子が数字になっています。
もしも欠番があった場合、そこで結合処理を打ち切れば良いのでしょうか?


> もう少しスマートなプログラムが作成出来そうなのですがアドバイス頂けると助かります。
最初に連番をカウントしているようですが、必ずしもその必要は無い気がします。
拡張子自体が 001〜999 固定なのであれば、こんな感じでいかがでしょう。

'Imports System.IO
Using fs As New BinaryWriter(New FileStream("C:\join\test.ok", FileMode.Create))
 For n As Integer = 1 To 999
  Dim f As String = String.Format("C:\join\test.{0:000}", n)
  If Not System.IO.File.Exists(f) Then
   Exit For
  End If
  fs.Write(File.ReadAllBytes(f))
 Next
 fs.Close()
End Using
魔界の仮面弁士さん、アドバイス有り難うございます。
欠番が有れば打ち切る処理の案を頂きます。

拡張子も確かに連番で生成しているので1〜999の処理で作ると短くなりますね。
大変参考になりました。

一人で考えても同じ案しか浮かびにくいので困っていました。
アドバイス本当に有り難うございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板