Delphi XE7で開発し、Windows7 32bitのPCで動作させているアプリですが、
ファイルのコピーや読み込みをしていると、ファイルの中身が全て00H文字に
なり、データが消えてしまう事があります。ファイルはUTF-16です。
もしかするとここへの質問ではないかもしれませんが、
過去にこのような現象に遭遇したことがある方がおりましたら、
教えてください。
多分回答がつきにくいと思うので…。
「ファイルのコピー」は具体的にどのような処理でしょうか?
「読み込み」は具体的にどのように行っているのでしょうか?
データが消えていることはどのように確認しましたか?
基本的にはたかのんさんのコードにまずいところがあるのだと思います。
それをどのように探すか、ですが…。
追加情報ですが、壊れたファイルの更新日時を見ても壊れる前と同じである
のが不思議なのです。
「ファイルコピー」は、CopyFileを使用しています。
「読み込み」はTFileStreamで読んだデータをString変数に入れて使用しています。
データが消えているのは、バイナリエディタで確認しました。
私がアプリの全てを作成したわけではないので、どこを探していけばよいか
まだ判断が付かず、また現象が起きているPCが手元に無いので、現象の再現が
できない状況です。
ファイルのコピーと読み込みしかしていませんか?
ありがちですが、文字列をTStreamに*書き込む*ときにパラメータとして先頭文字への参照を
渡さなければならないところ、文字列変数(=ポインタ)を渡してしまう、という間違いがあります。
var
S: String;
begin
Stream.WriteBuffer(S,Length(S) * SizeOf(Char));
これだとだめで、
Stream.WriteBuffer(PChar(S)^,Length(S) * SizeOf(Char));
こうしなければならない、というやつです。
あと、当該ファイルにReadOnly属性をつけてみるとか、ファイルのアクセス許可から書き込みを外すとかで
エラーが発生するところを探してみる、という手はいかがでしょう?
ともあれ再現手順の確立が先ですね。ひょっとしたら特定のPC固有の問題(つまり壊れてる)かもしれませんし。
現象が起きているPCを確認することができました。
PCの強制終了を行った後にデータが消えていることが判明しました。
多分これが原因のようです。
通りすがり様にはお手数をお掛けいたしました。
ツイート | ![]() |