0

私は次のコードを書きました:

public static class PLog
{
    private static FileStream logFileStream;
    private static string logFilePath;

    public static void Initialize()
    {
        logFilePath = PSettings.IO.dirLogs + "log_" + DateTime.Now.ToString("ddMMyy_HHmmss") + ".txt";

        if (!Directory.Exists(PSettings.IO.dirLogs)) Directory.CreateDirectory(PSettings.IO.dirLogs);

        logFileStream = new FileStream(logFilePath, FileMode.Create);
    }

    public static void WriteLine(string text)
    {
        byte[] textArray = Encoding.ASCII.GetBytes("[" + DateTime.Now.ToString("dd.MM.yyyy - HH:mm:ss") + "] " + text + "\n");

        logFileStream.Write(textArray, 0, textArray.Length);
    }

    public static void Close()
    {
        logFileStream.Close();
    }
}

しかし、このように呼び出すと、ファイルには何も書き込まれません。

PLog.Initialize();
PLog.WriteLine("test");
PLog.Close();

ファイルは作成されましたが、サイズが 0 バイトでした。

4

2 に答える 2

3

FileStream実装しIDisposableます。

ストリームを適切にクリーンアップするために IDisposable.Dispose() が呼び出されることを実際に保証するのは難しいため、コードに示すような静的コンテキストで使用することはほとんどお勧めできません。

可能であれば、 usingFileStreamキーワードを使用して、確実に呼び出されるようにしますDispose()

using (FileStream fs = new FileStream(logFilePath, FileMode.Create))
{
   // Do stuff with fs
}

現在の構造を保持する必要がある場合は、Close() 実際に呼び出されていることを確認してください (たとえば、呼び出されないようにする例外が発生していないことを確認してください)。

アップデート

他の回答へのコメントについて:

Environment.Newline書き出す前に、文字列の末尾に追加します。

または、メソッドを公開するStreamWriterを使用できますWriteLine()

于 2013-02-04T22:47:52.040 に答える
1

保存するにはフラッシュを使用する必要があります

logFileStream.Flush();

編集:

Close もフラッシュする必要がありますが、後でフラッシュが発生した場合、バッファがガベージ コレクションされる可能性があります。

于 2013-02-04T22:45:06.327 に答える