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

わんくま同盟

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

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

ツリー一括表示

ファイルをロックしてから上書き /az (17/04/21(Fri) 10:57) #83899
Re[1]: ファイルをロックしてから上書き /Hongliang (17/04/21(Fri) 11:07) #83901
Re[1]: ファイルをロックしてから上書き /魔界の仮面弁士 (17/04/21(Fri) 11:20) #83902
  └ Re[2]: ファイルをロックしてから上書き /az (17/04/21(Fri) 13:47) #83910 解決済み


親記事 / ▼[ 83901 ] ▼[ 83902 ]
■83899 / 親階層)  ファイルをロックしてから上書き
□投稿者/ az (1回)-(2017/04/21(Fri) 10:57:57)

分類:[C#] 

実現したい事は処理の前にファイルをロックし
処理後に文字列を書き込む(上書き)ということをしたいのですが
以下のコードだと追記になってしまいます。
上書きモードすることはできないでしょうか。
よろしくお願いします。

メソッド1
_FileStreamはインスタンス変数です。
_FileStream = new System.IO.FileStream(
_FilePath,
System.IO.FileMode.Open,
System.IO.FileAccess.ReadWrite,
FileShare.None);

メソッド2
StreamWriter sw = new StreamWriter(_FileStream);
sw.Write("書き込みたい文字列"); // 元のファイルに存在する行を削除、追加
sw.Flush();


[ □ Tree ] 返信 編集キー/

▲[ 83899 ] / 返信無し
■83901 / 1階層)  Re[1]: ファイルをロックしてから上書き
□投稿者/ Hongliang (529回)-(2017/04/21(Fri) 11:07:18)
StreamWriterをnewする直前に、_FileStream.SetLength(0)すればいいんでは。
一行だけ消す、となるとちょっと複雑ですが。
[ 親 83899 / □ Tree ] 返信 編集キー/

▲[ 83899 ] / ▼[ 83910 ]
■83902 / 1階層)  Re[1]: ファイルをロックしてから上書き
□投稿者/ 魔界の仮面弁士 (1267回)-(2017/04/21(Fri) 11:20:41)
No83899 (az さん) に返信
> _FileStream = new System.IO.FileStream(
>   _FilePath,
>   System.IO.FileMode.Open,
>   System.IO.FileAccess.ReadWrite,
>   FileShare.None);

最後の引数だけ、"System.IO." が省略されているのが非対称的で気になりましたが、それはさておき。



> 以下のコードだと追記になってしまいます。

FileMode.Append + FileAccess.Write なら追記になりますが、
FileMode.Open + FileAccess.ReadWrite なら
現在の位置からの上書きになるはずなんですけれどね…。


出力を始める前に _FileStream.Position の値を
確認してみてください。上書きしたい位置ではなく、
ファイルの末尾を指していたりはしませんか?

(たとえば、StreamReader.ReadToEnd を事前に呼び出していたりすると、
 Position がファイル末尾に移動することになります)
[ 親 83899 / □ Tree ] 返信 編集キー/

▲[ 83902 ] / 返信無し
■83910 / 2階層)  Re[2]: ファイルをロックしてから上書き
□投稿者/ az (2回)-(2017/04/21(Fri) 13:47:27)
ご回答ありがとうございます。
書き込み前にReadToEndを呼び出しているのが原因のようです。

ありがとうございました。
解決済み
[ 親 83899 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -