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

[ 最新記事及び返信フォームをトピックトップへ ]

■34976 / inTopicNo.1)  バイナリーファイルの結合と分解
  
□投稿者/ よっし〜 一般人(3回)-(2021/12/14(Tue) 08:18:42)
  • アイコン環境/言語:[VB2013] 
    分類:[.NET] 

    お疲れ様です。直接VSの内容でな無いのですが、皆様にアイデアをお伺いしたく投稿しました。

    現在3つのファイルを結合して1つのファイルにして保存し、その後保存したファイルの中から
    1つのファイルを取り出せないか検討中です。
    例として、「ABC.XLS」と「EFG.PDF」と「HIJ.JPG」を1つの「XYZ.DAT」として保存します。
    後から「EFG.PDF」を取り出して復元したいのです。

    私の考えですとReadAllBytesで「ABC.XLS」+「EFG.PDF」+「HIJ.JPG」→WriteAllBytes「XYZ.DAT」で、取り出す用に
    ヘッダー情報として各ファイルのファイル名やバイト範囲(バイト数)を「XYZ.DAT」の前に付けたものを保存すればできるのかな・・と
    考えております。
    ただ「XYZ.DAT」は「ヘッダー情報」+「各ファイル」となっているので、今度「ヘッダー情報」とファイルの区切りが分かりません。
    この場合、各情報の間に何か「区切り文字」と入れて分解する方法がセオリーでしょうか??

    皆様のアイデアをお教えください。


マルチポストを報告
違反を報告
引用返信 削除キー/
■34977 / inTopicNo.2)  Re[1]: バイナリーファイルの結合と分解
□投稿者/ 魔界の仮面弁士 大御所(1414回)-(2021/12/14(Tue) 10:05:41)
  • アイコン
    No34976に返信(よっし〜さんの記事)
    > 現在3つのファイルを結合して1つのファイルにして保存し、
    zip などの「アーカイブ」では駄目なのでしょうか?
    ファイル名、ファイルサイズ、タイムスタンプまで保持できますし、
    データ破損チェックの仕組みも備えています。
    
    あるいは、それぞれのバイナリを画素データと見做したうえで、
    マルチページTIFFや Animated GIF とするという手法もあります。
    (ストライドに気を使う必要があるので、zip の方が楽だとは思いますが)
    
    
    どんなフォーマットでも良いなら、こういう手も。
    
    <Serializable>
    Public Class FileInfo
        Public Property Name As String
        Public Property Binary As Byte()
        Public Sub New()
            Name = Nothing
            Binary = New Byte(-1) {}
        End Sub
        Public Sub New(filePath As String)
            Name = filePath
            Binary = File.ReadAllBytes(filePath)
        End Sub
    End Class
    
    Sub Main()
        Dim saveData As FileInfo() = {
            New FileInfo("D:\ABC.XLS"),
            New FileInfo("D:\EFG.PDF"),
            New FileInfo("D:\HIJ.JPG")
        }
    
        '保存処理
        Dim serializer As New BinaryFormatter()
        Using outStream As New FileStream("D:\XYZ.DAT", FileMode.Create)
            serializer.Serialize(outStream, saveData)
        End Using
    
    
        '読み取り処理
        Dim loadedData As FileInfo()
        Dim deserializer As New BinaryFormatter()
        Using inStream As New FileStream("D:\XYZ.DAT", FileMode.Open)
            loadedData = DirectCast(deserializer.Deserialize(inStream), FileInfo())
        End Using
    
        Console.WriteLine($"ファイル数={loadedData.Length}")
        For Each info In loadedData
            Console.WriteLine($" 名前={info.Name}")
            Console.WriteLine($" 長さ={info.Binary.Length}")
            Console.WriteLine($" 内容={BitConverter.ToString(info.Binary.Take(16).ToArray())}")
        Next
    End Sub

違反を報告
引用返信 削除キー/
■34978 / inTopicNo.3)  Re[2]: バイナリーファイルの結合と分解
□投稿者/ よっし〜 一般人(4回)-(2021/12/14(Tue) 11:03:04)
  • アイコン魔界の仮面弁士さん、早速のご教示、有り難うございます。

    あれだけ悩んでゴロゴリとしていたのに、これだけシンプルな方法で且つファイル名などの格納出来るなんて感動です。
    (私もまだまだだと痛感しました)
    ファイルをクラス化するなど、目から鱗です。

    どうも有り難うございました。


    No34977に返信(魔界の仮面弁士さんの記事)
    > ■No34976に返信(よっし〜さんの記事)
    > どんなフォーマットでも良いなら、こういう手も。

解決み!
違反を報告
引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

Mode/  Pass/


- Child Tree -