テキストファイル出力の完了を待つには?

解決


はると  2006-08-21 08:55:06  No: 22945

あるフォームで、TStringListのSaveToFile()メソッドを発行しています。
ノートPCで、HDDの遅いモードでの運用時、
このフォームを閉じるとアプリケーションがフリーズするという現象が発生し、
テキストファイルの書き込みが完了していないのが原因ではないかと推測しました。
その根拠は、3秒ほど待ってからフォームを閉じると、
フリーズが発生しないためです。

そこで質問なのですが、SaveToFile()メソッドで、
対象のファイルの保存が完了したことを確認するにはどうすれば良いでしょうか?
試しに、ループでFileExists(当該ファイル名)を行って、
ファイルの存在をチェックして抜けるようにしてみたのですが、
これでは効果がありませんでした。

妙案がありましたらよろしくお願いします。


はて  2006-08-21 09:14:46  No: 22946

「TStringListのSaveToFile()メソッド」から返ってきた時には書き出しは終了しているはずですよ。
(システムのキャッシュには残っているかもしれませんが)
FBusy := True;
lst.SaveToFile(・・・);
FBusy := False;
等としておいて
フォームのOnCloseQueryでFBusyの判定をしてみては?


もにゃ  2006-08-21 19:28:39  No: 22947

スレッド等を使って複雑な処理をしている場合は別ですが、
TStringListのSaveToFile()の実行中は他の処理(終了含む)が割り込むことは出来ません。
原因は他にあると思われます。


はると  2006-08-21 20:24:37  No: 22948

貴重な情報をありがとうございました。

ノートPCの省電力モードのみで発生する事象なので、
Delphiには関係のない部分が原因かも知れません。
探求してみたいと思います。


deldel  2006-08-22 17:52:32  No: 22949

解決されてますが・・・以下はどうでしょうか?
ファイルサイズを監視して、不変になれば完全に作成されたと判断してます。

var
  SearchRec: TSearchRec;
  boFileMakeDone: Boolean;
  lwFileSize: Longword;
  saFileName: AnsiString;
begin
  lwFileSize := 0;
  boFileMakeDone := False;
  while not boFileMakeDone do begin
    FindFirst(saFileName, faAnyFile, SearchRec);
    try
      if (lwFileSize <> Longword(SearchRec.Size)) or (lwFileSize = 0) then begin
        lwFileSize := SearchRec.Size; //ファイルサイズ取得
        sleep(100); //ちょっと待つ
      end else
        boFileMakeDone := True; //ファイルが完全に作成された
    finally
      FindClose(SearchRec);
    end;
  end;
end;


はると  2006-08-23 19:47:47  No: 22950

追加アドバイス、ありがとうございます。
まだ試してはいないのですが、「サイズを見ないとダメなのかな?」
などと考えていたため、大変参考になりました。
もう少し時間を要するかもしれませんが、できれば顛末を書き込みたいと思います。
ありがとうございました。


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

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






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