C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

バイナリファイルのデータの一部を書き換える方法

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■83143 / inTopicNo.1)  バイナリファイルのデータの一部を書き換える方法
  
□投稿者/ くまー (1回)-(2017/03/08(Wed) 11:37:58)

分類:[.NET 全般] 

例えば、バイナリファイルの2000byte〜2003byteのみを別のデータに書き換えたいとします。

VBAだと

	dim hairetu() as byte
	redim hairetu(3)
	


        Open filepath For Binary As intFileNumber
                                
                Put intFileNumber, 2000, hairetu                
                
          Close intFileNumber               '必ず、最後にcloseする必要がある
          
のようにすることでできました。

同じ事をVB.NETでもやりたいのですが


	dim hairetu(3) as byte

       Using stream As IO.Stream = New FileStream(filepath, FileMode.Create)
       Using writer As New BinaryWriter(stream)

            stream.Seek(2000, SeekOrigin.Begin)

            writer.Write(hairetu)

       End Using
       End Using

とやると、2004byte以降のデータが消えてしまいます。

FileMode.CreateをAppendにしてもみましたが
これだと、ファイルの最後からの書き込みになってしまいます。

BinaryReaderを使って、最後の部分だけ書き込むという方法ならできると思いますが
大きなファイルサイズだとメモリを多く消費することや
速度の面から考えても、
一部データだけ書き換える方法を探しています。

どのようにすれば良いでしょうか?

引用返信 編集キー/
■83145 / inTopicNo.2)  Re[1]: バイナリファイルのデータの一部を書き換える方法
□投稿者/ とっちゃん (427回)-(2017/03/08(Wed) 11:49:58)
No83143 (くまー さん) に返信
> FileMode.CreateをAppendにしてもみましたが
> これだと、ファイルの最後からの書き込みになってしまいます。
>
> BinaryReaderを使って、最後の部分だけ書き込むという方法ならできると思いますが
> 大きなファイルサイズだとメモリを多く消費することや
> 速度の面から考えても、
> 一部データだけ書き換える方法を探しています。
>
> どのようにすれば良いでしょうか?
>
FileMode 列挙体のリファレンスにそれぞれのフラグの説明がありますが
「必ず存在するファイル」の変更が目的ならば、
FileMode.Open を使います。

FileMode.Create だと、ファイルがあろうとなかろうと必ず新規作成状態になります。
なので、2000バイト目よりも前がどうなってるかは保証されません。
もちろん、後ろもばっさり切り捨てられます。

Appendは追記モードという特殊なモードなので、こちらも使えません。

引用返信 編集キー/
■83146 / inTopicNo.3)  Re[2]: バイナリファイルのデータの一部を書き換える方法
□投稿者/ くまー (2回)-(2017/03/08(Wed) 12:03:32)
FileMode.Open でしたか
うまくいきました
ありがとうございます。

あと、もう一つ質問させていただいたいのですが
writer.Write(hairetu)
とした場合
hairetu(0)
hairetu(1)
hairetu(2)
hairetu(3)
という順番で書き込みが行われますが

hairetu(3)
hairetu(2)
hairetu(1)
hairetu(0)

のように逆順で書き込むコマンドはございますでしょうか?

自分で配列を入れ替えれば済む話なのですが
VB.NETの標準機能であれば教えてください
 
引用返信 編集キー/
■83147 / inTopicNo.4)  Re[3]: バイナリファイルのデータの一部を書き換える方法
□投稿者/ Hongliang (508回)-(2017/03/08(Wed) 12:24:08)
存在しません。
// ニッチすぎると思う。

BinaryWriterでは、WriteでIntegerなどを書き込むことができますが、この場合はリトルエンディアンで書き込まれます。

なお、ArrayクラスにReverseという静的メソッドが存在しています。
引用返信 編集キー/
■83148 / inTopicNo.5)  Re[3]: バイナリファイルのデータの一部を書き換える方法
□投稿者/ shu (972回)-(2017/03/08(Wed) 12:31:13)
No83146 (くまー さん) に返信

> のように逆順で書き込むコマンドはございますでしょうか?
逆順で書き込むコマンドはありません。


> 自分で配列を入れ替えれば済む話なのですが
> VB.NETの標準機能であれば教えてください

例えば
Dim a() as Byte = {1, 2, 3}
Dim b = a.Reverse.ToArray
のようにすればbはaの逆順配列になります。
引用返信 編集キー/
■83149 / inTopicNo.6)  Re[4]: バイナリファイルのデータの一部を書き換える方法
□投稿者/ くまー (3回)-(2017/03/08(Wed) 15:34:55)
ありがとうございます。

.Reverse.ToArray

で解決しました。
 
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ