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

バイナリーファイルの上書き

環境/言語:[windows98 c#]
分類:[.NET]

C#初心者です。
サイト内の、NETTipsを参考にして、次のようなバイナリーファイルをビット反転して、上書きするものを作ってみましたが、実行してみると上書きでなく追加になってしまいます。上書きするようにするには、どうすればいいのでしょうか?MSDNもしらべましたが、わかりませんでした。
お教えいただければ幸いです。

using System;
class test{
static void Main(){
string fileName = @"C:\test.bin";

System.IO.FileStream fs =
new System.IO.FileStream(fileName,
System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite);

byte[] bs = new byte[fs.Length];

fs.Read(bs, 0, bs.Length);




byte[] bs2=new byte[fs.Length];

for(int i=0 ;i<fs.Length;i++){
bs2[i]=(byte)(bs[i]^255);}


fs.Write(bs2,0, bs2.Length);
fs.Close();
}
}
> new System.IO.FileStream(fileName,
> System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite);

原因は、FileMode.Openでファイルをオープンしているためです。
FileModeを調べてみて下さい。
■No3993に返信(NowhereManさんの記事)
NowhereManさん、ご回答ありがとうございます。当方、プログラミングをはじめたばかりなので、MSDNでFileModeOpenをしらべてみましたがよくわかりませんでした。具体的にどうすればよいのでしょうか?
> 当方、プログラミングをはじめたばかりなので、MSDNでFileModeOpenを
> しらべてみましたがよくわかりませんでした。具体的にどうすればよいのでしょうか?

System.IO.FileMode列挙体には、Open以外にもメンバがあります。
その中に、ファイルを上書きするためのモードがあるので、調べてみて下さい。
■No4001に返信(NowhereManさんの記事)
Truncate を使ってみましたができませんでした。具体的に上のプログラムのどこを直せばいいのか教えてほしいのですが。
すいません。元のコードをよく見たら、FileModeだけの問題では
ありませんでした。読み込み -> 書き出し を続けて行っているのも
問題です。Read()でファイル全体を読み込んだ時点でFileStreamの
現在位置はファイルの末尾になっています。続けてWrite()すると
FileStreamの現在位置(=ファイル末尾)から書き出されます。

sawaさんの考えている処理を実現するには、
1. 読み込みモードでオープンし、ファイルから読み込み後
一旦クローズ。
2. 上書きモードでオープンし、ファイルに書き出し。
という手順になります。
2004/05/14(Fri) 06:38:08 編集(投稿者)

■No4015に返信(NowhereManさんの記事)
以下のように書き直しましたが,閉じたファイルにはアクセスできませんと、エラーになります。
どこが間違っているのでしょうか?
using System;
class test{
static void Main(){
string fileName = @"C:\test.bin";

System.IO.FileStream fs =
new System.IO.FileStream(fileName,
System.IO.FileMode.Open, System.IO.FileAccess.Read);

byte[] bs = new byte[fs.Length];

fs.Read(bs, 0, bs.Length);
fs.Close();




byte[] bs2=new byte[fs.Length];

for(int i=0 ;i<fs.Length;i++){
bs2[i]=(byte)(bs[i]^255);}

System.IO.FileStream fs2 =
new System.IO.FileStream(fileName,
System.IO.FileMode.Truncate, System.IO.FileAccess.Write);


fs2.Write(bs2,0, bs2.Length);
fs2.Close();
}
}
> 以下のように書き直しましたが,閉じたファイルにはアクセスできませんと、
> エラーになります。
> どこが間違っているのでしょうか?

エラー発生箇所を調べると、次の行でエラーが発生していることが
分かると思います。
> byte[] bs2=new byte[fs.Length];
原因は、fsをクローズした後でfs.Lengthにアクセスしているためです。
ここではfs.Lengthを使用する代わりに、データはbsに読み込んでいるため、
データサイズはbsから取り出すことができます。
また、この行の後にもう1箇所、fs.Lengthを使用している箇所があります。
■No4030に返信(NowhereManさんの記事)
できました!!!。度重なる質問にお答えくださり、
まことにありがとうございました。
 MSDNを見ていると、知らないこと意味のわからないことばかりで、
これから少しずつ勉強していこうと思っています。
解決済み!

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