Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我的StreamWriter不写入文件?_C#_Logging_Streamwriter - Fatal编程技术网

C# 为什么我的StreamWriter不写入文件?

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类,我得到的只是一个空文件——里面没有文本

我正在使用StreamWriter为我的程序制作日志,以写入文件。我有一些代码看起来很管用,但它只是做了它应该做的一部分

我创建了一个名为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并没有覆盖它看起来的任何内容。丢失日志修复了它;谢谢我有点不敢相信我自己没看到。我不太担心覆盖文件——给出的路径只是为了测试;我敢肯定,每次调用这个方法时,我都会得到一个不同的目标路径