ファイルの内容が消えてしまう

解決


たかのん  2017-09-27 22:40:05  No: 48782

Delphi XE7で開発し、Windows7 32bitのPCで動作させているアプリですが、
ファイルのコピーや読み込みをしていると、ファイルの中身が全て00H文字に
なり、データが消えてしまう事があります。ファイルはUTF-16です。

もしかするとここへの質問ではないかもしれませんが、
過去にこのような現象に遭遇したことがある方がおりましたら、
教えてください。


通りすがり  2017-09-27 23:08:36  No: 48783

多分回答がつきにくいと思うので…。
「ファイルのコピー」は具体的にどのような処理でしょうか?
「読み込み」は具体的にどのように行っているのでしょうか?
データが消えていることはどのように確認しましたか?

基本的にはたかのんさんのコードにまずいところがあるのだと思います。
それをどのように探すか、ですが…。


たかのん  2017-09-28 01:18:55  No: 48784

追加情報ですが、壊れたファイルの更新日時を見ても壊れる前と同じである
のが不思議なのです。
「ファイルコピー」は、CopyFileを使用しています。
「読み込み」はTFileStreamで読んだデータをString変数に入れて使用しています。
データが消えているのは、バイナリエディタで確認しました。

私がアプリの全てを作成したわけではないので、どこを探していけばよいか
まだ判断が付かず、また現象が起きているPCが手元に無いので、現象の再現が
できない状況です。


通りすがり  2017-09-28 09:35:44  No: 48785

ファイルのコピーと読み込みしかしていませんか?
ありがちですが、文字列をTStreamに*書き込む*ときにパラメータとして先頭文字への参照を
渡さなければならないところ、文字列変数(=ポインタ)を渡してしまう、という間違いがあります。
var
  S: String;
begin
  Stream.WriteBuffer(S,Length(S) * SizeOf(Char));
これだとだめで、
  Stream.WriteBuffer(PChar(S)^,Length(S) * SizeOf(Char));
こうしなければならない、というやつです。

あと、当該ファイルにReadOnly属性をつけてみるとか、ファイルのアクセス許可から書き込みを外すとかで
エラーが発生するところを探してみる、という手はいかがでしょう?

ともあれ再現手順の確立が先ですね。ひょっとしたら特定のPC固有の問題(つまり壊れてる)かもしれませんし。


たかのん  2017-11-30 18:57:20  No: 48786

現象が起きているPCを確認することができました。
PCの強制終了を行った後にデータが消えていることが判明しました。
多分これが原因のようです。
通りすがり様にはお手数をお掛けいたしました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加