私はtstringlistで非常に簡単なログを作成します。私はファイルに書き込みます:Delphi Tstringlistは、ファイル同期を書き込みます
pLog.SaveToFile(FileName);
どこかにバグがあり、コンピュータがシャットダウンしています。 ログファイルが見つかりません。ファイルがasychモードで保存されている可能性があります。 実行前に書き込みを待つ方法がありますか?
おかげで、 アルベルト
私はtstringlistで非常に簡単なログを作成します。私はファイルに書き込みます:Delphi Tstringlistは、ファイル同期を書き込みます
pLog.SaveToFile(FileName);
どこかにバグがあり、コンピュータがシャットダウンしています。 ログファイルが見つかりません。ファイルがasychモードで保存されている可能性があります。 実行前に書き込みを待つ方法がありますか?
おかげで、 アルベルト
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が発生したことに対して、もっともらしい理由を示しています。 –
もちろん、私は古いスタイルのパスカルI/Oを賛成できませんが、それは別の問題です! –
これは良いと思う1つのケースです。これは、ヒープが壊れている場合でも動作しますが、ヒープメモリを破損していると、このロギングコード自体が失敗する原因となりますが、ファイルストリームを割り当てたり、ファイルストリームオブジェクトをヒープから使用したりする必要があります。 。 –
が同期して動作します。
問題の最も明白な原因は次のとおりです。
私はすべてのtstringlistを書き直すsavetofileを呼び出します。それは動作しますが、コンピュータのシャットダウンが異常終了した場合、長さがゼロのファイルが見つかりました(シャウトダウンの前に2,3時間書き込むことができます)。 – Alberto
'TStringList.SaveToFile'が同期して動作します。それは論争ではない。 –
バグがある場合、それはあなた自身のコード内で最も可能性が高いのですが。 'pLog'は割り当てられていますか? '(F7)'を実行し、 'classes.pas'のコードに従えますか? –