【问题标题】:Can't write to filestream无法写入文件流
【发布时间】:2016-04-05 22:58:18
【问题描述】:

我创建了一个 fileStream 和一个 streamwriter 来写入。问题是我的文件没有显示任何文本。对象已正确实例化,路径和所有内容都已写入,只是看不到任何写入内容。也许是streamwriter的问题?

public class Logger {
        StreamWriter sw;
        FileStream logFileStream;

        public enum LogLevel
        {
            Low,
            Medium,
            High
        };

        public Logger(string filePath)
        {
            //logStream = new StreamWriter(logFilePath, false);
            logFileStream = new FileStream(filePath, FileMode.Open, FileAccess.Write);
            sw = new StreamWriter(logFileStream);
        }

        public void LogMessage(string message) {
            LogMessage(message, LogLevel.Low, false);
        }

        public void LogMessage(string message, LogLevel level, bool excludeFromLogFile){
            var prefix = string.Empty;
            ConsoleColor color = ConsoleColor.White;

            switch (level)
            {
                case LogLevel.Medium:
                    prefix = "?";
                    color = ConsoleColor.Yellow;
                    break;
                case LogLevel.High:
                    prefix = "!";
                    color = ConsoleColor.Red;
                    break;
            }
            if (!excludeFromLogFile)
            {
                sw.WriteLine("{0} {1} {2}", prefix, DateTime.Now, message);
            }
            Console.ForegroundColor = color;
            Console.WriteLine("{0}", message);
            Console.ResetColor();
        }

我正在实例化这个类,然后调用 logger.LogMessage("poop", Logger.LogLevel.High, false); 并没有显示任何内容。

谢谢

【问题讨论】:

  • 您的记录器类使FileStreamStreamWriter 保持打开状态。在您调用 Dispose 之前,数据通常不会被刷新。

标签: c# .net filestream


【解决方案1】:

写入正在缓存在内存中,请尝试在每个 Log 函数的末尾调用 logFileStream.Flush();

你真的不应该在调用之间保持文件句柄打开,如果我是你,我会在每个函数中打开和关闭它。如果您要进行大量日志记录,请自己将其缓冲在内存中,并在达到一定大小后转储整个内容。

【讨论】:

  • 你自己在内存中缓冲是什么意思?如在达到一定大小之前不要调用flush?如何检查缓冲区的大小?
  • 一种选择是将其写入MemoryStream,然后使用 StreamWriter 写入。 Position 属性会告诉你到目前为止你写了多少,GetBuffer() 会给你一个字节数组。或者,您可以使用StringBuilder,在这种情况下,Length 将为您提供长度,而 ToString() 将为您提供单个字符串。在大多数情况下,我个人会使用 MemoryStream。
【解决方案2】:

这是您示例的正确版本

  • 在流​​写入器中使用 autoflush = true
  • 在每个请求中打开/关闭流 - 如果正确实现,则不需要自动刷新(在 dispose StreamWriter 后会进行刷新)
  • 使用 FileMode.Append
公共类记录器 { 公共枚举 LogLevel { 低的, 中等的, 高的 }; 私有只读字符串_filePath; 公共记录器(字符串文件路径) { //logStream = new StreamWriter(logFilePath, false); _filePath = 文件路径; } 公共无效日志消息(字符串消息) { LogMessage(消息, LogLevel.Low, false); } public void LogMessage(string message, LogLevel level, bool excludeFromLogFile) { 使用 (var fileStream = new FileStream(_filePath, FileMode.Append, FileAccess.Write)) { 使用 (var writer = new StreamWriter(fileStream) {AutoFlush = true}) { var prefix = string.Empty; var color = ConsoleColor.White; 开关(水平) { 案例 LogLevel.Medium: 前缀=“?”; 颜色 = ConsoleColor.Yellow; 休息; 案例 LogLevel.High: 前缀=“!”; 颜色 = ConsoleColor.Red; 休息; } if (!excludeFromLogFile) { writer.WriteLine("{0} {1} {2}", 前缀, DateTime.Now, 消息); } Console.ForegroundColor = 颜色; Console.WriteLine("{0}", message); Console.ResetColor(); } } } }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    相关资源
    最近更新 更多