我想创建一个简单的记录器,为此,我以这种方式使用委托:
delegate void Logger(string message);
但是当我尝试使用下面的方法创建一个Logger时,这并没有在文件中添加任何内容。
Logger CreateFileLogger(string filePath) {
if (!File.Exists(filePath)) File.Create(filePath);
StreamWriter stream = File.AppendText(filePath);
return stream.WriteLine;
}
无论如何我都不敢肯定地说这是StreamWriter类的问题还是委托的问题。
谢谢。
答案 0 :(得分:3)
您永远不会丢弃该流,并且永远不会刷新该流(因为您没有足够的写入),因此什么也不会写入该文件。您不应该泄漏这样的一次性资源。
幸运的是,根本不需要处理流。只需使用File.AppendAllText
即可,而不要自己创建流并对其进行管理。
答案 1 :(得分:1)
问题在于它正在写入StreamWriter
-但是您永远不会关闭该StreamWriter
,因此不会被刷新,您也会使文件句柄保持打开状态-不好。
如果确定执行刷新并关闭文件,则可以:
using System;
using System.IO;
class Test
{
static void Main()
{
using (var writer = new StreamWriter("test.txt"))
{
Action<string> logger = writer.WriteLine;
ExecuteDelegate(logger);
}
}
static void ExecuteDelegate(Action<string> logger)
{
logger("First line");
logger("Second line");
logger("Third line");
}
}
答案 2 :(得分:0)
您可以尝试将WriteLine包装在另一个动作中,例如:
Logger CreateFileLogger(string filePath) {
if (!File.Exists(filePath)) File.Create(filePath);
StreamWriter stream = File.AppendText(filePath);
return (str) => { stream.WriteLine(str); stream.Flush(); };
}
但是如上所述,流从未关闭。希望对您有所帮助。