无法写入文件流
Can't write to filestream
我已经创建了一个 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();
}
我正在实例化这个 class 然后调用 logger.LogMessage("poop", Logger.LogLevel.High, false);
但没有任何显示。
谢谢
写入正在内存中缓冲,尝试在每个日志函数结束时调用 logFileStream.Flush();
。
你真的不应该在调用之间保持文件句柄打开,如果我是你我会在每个函数中打开和关闭它。如果你正在做大量的日志记录,那么你自己将它缓冲在内存中,并在它达到一定大小时转储整个东西。
这是您示例的正确版本
- 在流写入器中使用 autoflush = true
- open/close 每个请求中的流 - 如果正确实现,则不需要自动刷新(刷新将在处理 StreamWriter 后完成)
- 使用FileMode.Append
public class Logger
{
public enum LogLevel
{
Low,
Medium,
High
};
private readonly string _filePath;
public Logger(string filePath)
{
//logStream = new StreamWriter(logFilePath, false);
_filePath = filePath;
}
public void LogMessage(string message)
{
LogMessage(message, LogLevel.Low, false);
}
public void LogMessage(string message, LogLevel level, bool excludeFromLogFile)
{
using (var fileStream = new FileStream(_filePath, FileMode.Append, FileAccess.Write))
{
using (var writer = new StreamWriter(fileStream) {AutoFlush = true})
{
var prefix = string.Empty;
var color = ConsoleColor.White;
switch (level)
{
case LogLevel.Medium:
prefix = "?";
color = ConsoleColor.Yellow;
break;
case LogLevel.High:
prefix = "!";
color = ConsoleColor.Red;
break;
}
if (!excludeFromLogFile)
{
writer.WriteLine("{0} {1} {2}", prefix, DateTime.Now, message);
}
Console.ForegroundColor = color;
Console.WriteLine("{0}", message);
Console.ResetColor();
}
}
}
}
我已经创建了一个 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();
}
我正在实例化这个 class 然后调用 logger.LogMessage("poop", Logger.LogLevel.High, false);
但没有任何显示。
谢谢
写入正在内存中缓冲,尝试在每个日志函数结束时调用 logFileStream.Flush();
。
你真的不应该在调用之间保持文件句柄打开,如果我是你我会在每个函数中打开和关闭它。如果你正在做大量的日志记录,那么你自己将它缓冲在内存中,并在它达到一定大小时转储整个东西。
这是您示例的正确版本
- 在流写入器中使用 autoflush = true
- open/close 每个请求中的流 - 如果正确实现,则不需要自动刷新(刷新将在处理 StreamWriter 后完成)
- 使用FileMode.Append
public class Logger { public enum LogLevel { Low, Medium, High }; private readonly string _filePath; public Logger(string filePath) { //logStream = new StreamWriter(logFilePath, false); _filePath = filePath; } public void LogMessage(string message) { LogMessage(message, LogLevel.Low, false); } public void LogMessage(string message, LogLevel level, bool excludeFromLogFile) { using (var fileStream = new FileStream(_filePath, FileMode.Append, FileAccess.Write)) { using (var writer = new StreamWriter(fileStream) {AutoFlush = true}) { var prefix = string.Empty; var color = ConsoleColor.White; switch (level) { case LogLevel.Medium: prefix = "?"; color = ConsoleColor.Yellow; break; case LogLevel.High: prefix = "!"; color = ConsoleColor.Red; break; } if (!excludeFromLogFile) { writer.WriteLine("{0} {1} {2}", prefix, DateTime.Now, message); } Console.ForegroundColor = color; Console.WriteLine("{0}", message); Console.ResetColor(); } } } }