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

BinaryWriterで挿入を行いたい

環境/言語:[WinXP/Vista .NET 2.0]
分類:[.NET]

こんにちわ

現在、BinaryReader/WriterでファイルをごにょごにょするAPを作ろうと考えています。

BinaryWriterの動作として、例えば30バイトのファイルを開き
5バイト目にSeekしてから3バイトWriteすると元ファイルの5〜7バイト目が
上書きされると思うのですが、これを挿入(33バイトのファイルになる)としたいです。

BinaryWriterクラスにはそのような機能はないみたいなのですが、
指定されたバイト位置から後ろを先読みしながら挿入データを書き込み、その後
先読みしておいたデータを順次書き込むことでデータがずれて
挿入の体をなす…という、パフォーマンスの悪そうな案しか出ませんでした。

何か効率のよいアイデア等はありますでしょうか…
以上よろしくお願いします
■No27592に返信(ぺんたごんさんの記事)
>
> BinaryWriterクラスにはそのような機能はないみたいなのですが、
> 指定されたバイト位置から後ろを先読みしながら挿入データを書き込み、その後
> 先読みしておいたデータを順次書き込むことでデータがずれて
> 挿入の体をなす…という、パフォーマンスの悪そうな案しか出ませんでした。
>
> 何か効率のよいアイデア等はありますでしょうか…
> 以上よろしくお願いします
この手のやり方しかないと思いますが、多少パフォーマンスを上げるなら、一括でデータを読み込んでメモリ内で加工して一気に書き換えるという方法があります。あまり大きいファイルには使えませんが。
返信ありがとうございます。

やはりそうですか…ファイルは用途上、数KB〜数MB程度のはずですが
仕様上は数十MBもできてしまうので悩みどころです。

とりあえずある程度のバッファごとにずらしてコピーする
方式をとりますが、引き続き良い案がありましたらご教示お願いいたしますm(_ _)m

(まだ解決にはしません。実装した処理のパフォーマンス次第)
> とりあえずある程度のバッファごとにずらしてコピーする
> 方式をとりますが、引き続き良い案がありましたらご教示お願いいたしますm(_ _)m

  無いです。
  が、パフォーマンスを稼ぐ方法はあります。
  PCの搭載メモリや空きメモリ容量に依存しますので・・・

  数百MBならRAMDISKでしょうか・・・
  数十MBなら、MmeoryStreamをバッファに使って、BinaryRead
  とBinaruWriteで終わり・・

  メモリも無いなら、元ファイルとTMPファイルの2個でコピー
  しながら追加するしか無いと思います。
  終わったら元ファイル削除して、TMPファイルをリネーム

以上。
やはり無いですか…

ではまだパフォーマンス検証してませんが解決とさせていただきます

ありがとうごあいました
解決済み!

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