C# 为什么我的StreamWriter不写入文件?
我正在使用StreamWriter为我的程序制作日志,以写入文件。我有一些代码看起来很管用,但它只是做了它应该做的一部分 我创建了一个名为Log的简单类(下面的代码) 我做了一个简单的测试程序,效果很好。它执行以下三行:C# 为什么我的StreamWriter不写入文件?,c#,logging,streamwriter,C#,Logging,Streamwriter,我正在使用StreamWriter为我的程序制作日志,以写入文件。我有一些代码看起来很管用,但它只是做了它应该做的一部分 我创建了一个名为Log的简单类(下面的代码) 我做了一个简单的测试程序,效果很好。它执行以下三行: Log l = new Log(@"C:\Users\SADunkerton\Desktop\l.txt"); l.writeLog("testing log"); l.closeLog(); 但在我更大的程序中,我实际上想使用Log类,我得到的只是一个空文件——里面没有文本
Log l = new Log(@"C:\Users\SADunkerton\Desktop\l.txt");
l.writeLog("testing log");
l.closeLog();
但在我更大的程序中,我实际上想使用Log类,我得到的只是一个空文件——里面没有文本。其代码如下所示:
Log log = new Log(folderPDFs + @"\Log.txt"); //folderPDFs is a parameter of this method--it is a string that is a complete path to a destination folder.
log.writeLog("Beginning conversions");
//do some stuff, including write to the log
log.writeLog("Finished converting. Success = " + success);
有人能告诉我为什么该代码的程序版本不起作用吗?1.在第二个示例中,您没有关闭流-我不确定垃圾收集会发生什么情况。调用
l.closeLog()代码>最终至少可以获得一些输出。但这不是一个好主意。如果某个方法在l.write()之间抛出,会发生什么代码>和l.closeLog代码>。有些不好的东西-文件将保持打开状态,直到GC处理它
2。每次调用都会覆盖文件。您可能需要附加数据,或者更好地更改代码以使用方法:
并删除closeLog
方法,因为它是不必要的
编辑:
最好的办法是只使用无状态的标准方法(正如@leppie所指出的),这样就不会泄漏任何资源:
如果为每个日志实例创建一个日志文件:
public void writeLog(string s)
{
File.WriteAllText(path,
DateTime.Now.ToString("dd-MM-yyyy H:mm:ss ") + s);
}
或者,如果您需要继续现有的日志:
public void writeLog(string s)
{
File.AppendAllText(path,
DateTime.Now.ToString("dd-MM-yyyy H:mm:ss ") + s);
}
1。在第二个示例中,您没有关闭流-我不确定垃圾收集会发生什么。调用l.closeLog()代码>最终至少可以获得一些输出。但这不是一个好主意。如果某个方法在l.write()之间抛出,会发生什么代码>和l.closeLog代码>。有些不好的东西-文件将保持打开状态,直到GC处理它
2。每次调用都会覆盖文件。您可能需要附加数据,或者更好地更改代码以使用方法:
并删除closeLog
方法,因为它是不必要的
编辑:
最好的办法是只使用无状态的标准方法(正如@leppie所指出的),这样就不会泄漏任何资源:
如果为每个日志实例创建一个日志文件:
public void writeLog(string s)
{
File.WriteAllText(path,
DateTime.Now.ToString("dd-MM-yyyy H:mm:ss ") + s);
}
或者,如果您需要继续现有的日志:
public void writeLog(string s)
{
File.AppendAllText(path,
DateTime.Now.ToString("dd-MM-yyyy H:mm:ss ") + s);
}
我将重写您的日志类以避免结束部分。
只需在完成编写部分后打开、写入和关闭即可
class MySimpleLog
{
private string _filename;
public MySimpleLog(string filename)
{
_filename = filename;
}
public void AppendText(string msg)
{
// Create an instance of StreamWriter to write text to a file.
// The using statement also closes the StreamWriter.
using (StreamWriter sw = new StreamWriter(_filename, true))
{
// Add some text to the file.
sw.WriteLine(msg);
}
}
}
这样,using语句将关闭流,您不必担心关闭它。事实上,如果代码中发生意外情况,关闭流可能会非常麻烦。(就像改变代码流的异常)
这只是测试和验证代码的起点,但是您可以按照给定的模式添加一些更复杂的逻辑。例如,您可以添加一个带有标志的构造函数来为everyline添加时间戳(或一个标志来添加分隔线,或一个标志来重新创建文件(如果存在…)
最后:请记住,专门的日志库经过良好测试,可以免费使用。也许你可以花点时间学习它们
我会重写您的日志类以避免结束部分。
只需在完成编写部分后打开、写入和关闭即可
class MySimpleLog
{
private string _filename;
public MySimpleLog(string filename)
{
_filename = filename;
}
public void AppendText(string msg)
{
// Create an instance of StreamWriter to write text to a file.
// The using statement also closes the StreamWriter.
using (StreamWriter sw = new StreamWriter(_filename, true))
{
// Add some text to the file.
sw.WriteLine(msg);
}
}
}
这样,using语句将关闭流,您不必担心关闭它。事实上,如果代码中发生意外情况,关闭流可能会非常麻烦。(就像改变代码流的异常)
这只是测试和验证代码的起点,但是您可以按照给定的模式添加一些更复杂的逻辑。例如,您可以添加一个带有标志的构造函数来为everyline添加时间戳(或一个标志来添加分隔线,或一个标志来重新创建文件(如果存在…)
最后:请记住,专门的日志库经过良好测试,可以免费使用。也许你可以花点时间学习它们
您的上一个示例没有closeLog
。您是否想过使用可靠且广泛使用的Log4Net之类的工具,而不是重新发明轮子。请尝试像这样打开AutoFlush。fs=新StreamWriter(路径){AutoFlush=true};您的上一个示例没有closeLog
。您是否想过使用可靠且广泛使用的Log4Net,而不是重新发明轮子。请尝试像这样打开自动刷新。fs=新StreamWriter(路径){AutoFlush=true};1.你(和我)假设最后一个例子是一个完整的例子,还有两个。op并没有覆盖它看起来的任何内容。丢失日志修复了它;谢谢我有点不敢相信我自己没看到。我不太担心覆盖文件——给出的路径只是为了测试;我敢肯定,每次调用这个方法时,我都会得到一个不同的目标路径。不要只从其他人的答案中吸取教训,你应该试着适当地相信他们。@Sayse你从其他人的答案中吸取教训是什么意思?我刚刚相信了这篇文章,而这篇文章不是答案,而是评论。@EugenePodskal-你的第一次编辑或多或少是史蒂夫答案的一个副本,你的第二次编辑是Leppies评论(从那以后你就相信了)1。你(和我)假设最后一个例子是一个完整的例子,还有两个。op并没有覆盖它看起来的任何内容。丢失日志修复了它;谢谢我有点不敢相信我自己没看到。我不太担心覆盖文件——给出的路径只是为了测试;我敢肯定,每次调用这个方法时,我都会得到一个不同的目标路径