2011-07-04 8 views
1

私はtstringlistで非常に簡単なログを作成します。私はファイルに書き込みます:Delphi Tstringlistは、ファイル同期を書き込みます

pLog.SaveToFile(FileName); 

どこかにバグがあり、コンピュータがシャットダウンしています。 ログファイルが見つかりません。ファイルがasychモードで保存されている可能性があります。 実行前に書き込みを待つ方法がありますか?

おかげで、 アルベルト

+1

バグがある場合、それはあなた自身のコード内で最も可能性が高いのですが。 'pLog'は割り当てられていますか? '(F7)'を実行し、 'classes.pas'のコードに従えますか? –

答えて

9

SaveToFileメソッドコールはプログラム終了時で、プログラムが異常終了した場合、この呼び出しはおそらく実行されません。私はすべてのログ呼び出しでログファイルを開き、ログのテキストと時刻を書き込み、フラッシュしてからログファイルを閉じます。このようにして、プログラムが異常終了した場合でも、ログテキストはファイルに書き込まれることが保証されます。

ここでは、コードです:

procedure TMainForm.Log (const s: string); 
var 
f: textfile; 

begin 
assignfile (f, logfilename); 
{$I-} // yes, I know: modern programming style requires a try/except block 
append (f); 
if ioresult <> 0 then rewrite (f); 
{$I+} 
writeln (f, datetostr (now), ' ', timetostr (now), ' ', s); 
flush (f); 
closefile (f); 
end; 
+1

+1してください。これは、私の答えからオプション1が発生したことに対して、もっともらしい理由を示しています。 –

+0

もちろん、私は古いスタイルのパスカルI/Oを賛成できませんが、それは別の問題です! –

+0

これは良いと思う1つのケースです。これは、ヒープが壊れている場合でも動作しますが、ヒープメモリを破損していると、このロギングコード自体が失敗する原因となりますが、ファイルストリームを割り当てたり、ファイルストリームオブジェクトをヒープから使用したりする必要があります。 。 –

3

が同期して動作します。

問題の最も明白な原因は次のとおりです。

  1. あなたはを呼び出していません。
  2. ファイル名が無効です(パスが存在しない可能性があります)。
  3. ファイル名は、ユーザーが書き込みアクセス権を持たないフォルダ(プログラムファイルフォルダなど)にあります。
+0

私はすべてのtstringlistを書き直すsavetofileを呼び出します。それは動作しますが、コンピュータのシャットダウンが異常終了した場合、長さがゼロのファイルが見つかりました(シャウトダウンの前に2,3時間書き込むことができます)。 – Alberto

+0

'TStringList.SaveToFile'が同期して動作します。それは論争ではない。 –

関連する問題