ごまなつ Blog

楽しく働ける世界を目指して

【C#】filestreamは既存ファイルに上書きできないのか?

zipファイルを読み込み、中身のxmlファイルの内容を編集してzipファイルを保存するソフトを作っています。その中で、「多重起動できて、同じファイルを開いたときは2つ目以降は編集できないように、異なるファイルは編集できるように」という要望があったため、filestreamを用いて開いているファイルの判断を行い、filestreamで保存するようにしました。

削除が保存できていない?

新しいxmlファイルを作る処理があり、その処理をした後一旦保存。その後削除してファイルを確認すると、削除したはずのファイルが削除されていません。

パスワードが変更される?

今回のzipファイルにはパスワードをかけていたのですが、そのパスワードが変更されていました。

奇怪な動作の理由

filestreamは、上書きをする処理がStreamWriterとは異なるようです。filestreamとして確保した長さより短いデータだと、既存のデータが残るようです。よって、StreamWriterを用いたいのですが、ファイルロックを使いたいのであればfilestreamを用いる必要があります。

解決策

fileStream.SetLength(0);

これを使うと正常にできるようになりました。filestreamの長さを強制的に0に設定することによって、常にfilestreamより長いデータである状況にしています。ほかの良い方法があるかもしれないので、調べていきます。