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() 以正确清理流。

如果可以,请FileStreamusing关键字一起使用以确保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

你需要使用flush来保存

logFileStream.Flush();

编辑:

关闭也应该刷新,但如果稍后发生,则缓冲区可能会被垃圾收集

于 2013-02-04T22:45:06.327 回答