StreamWriter.Write不向文件写入内容;也没有抛出异常。

26

我的C#代码(asp.net MVC)

StreamWriter tw = new StreamWriter("C:\\mycode\\myapp\\logs\\log.txt");

// write a line of text to the file
tw.Write("test");

文件已经被创建,但是为空。没有抛出任何异常。我以前从未见过这种情况,现在卡住了。我只需要写一些调试输出。

请给予建议。


以防有人需要了解,使用的是哪种语言?(可能是C++或C#) - Cannoliopsida
8个回答

72

默认情况下,StreamWriter是带缓冲区的,这意味着它不会输出内容,直到接收到Flush()或Close()调用。

如果需要,您可以通过设置AutoFlush属性来更改此行为。否则,只需执行以下操作:

StreamWriter tw = new StreamWriter("C:\\mycode\\myapp\\logs\\log.txt");

// write a line of text to the file
tw.Write("test");
tw.Close();  //or tw.Flush();

2
我曾经遇到过同样的问题- 尽管一切正确但无法写入。不知道flush/close是什么。我认为这是最好的答案。 (我知道这已经老了) - Nyra

8
你需要在写完后关闭或刷新 StreamWriter。
tw.Close();

或者

tw.Flush();

但最佳实践是将输出代码包装在using语句中,因为StreamWriter实现了IDisposable接口:

using (StreamWriter tw = new StreamWriter("C:\\mycode\\myapp\\logs\\log.txt")){
// write a line of text to the file
tw.Write("test");
}

7

既不刷新也不关闭也不处理。 试试这个。

using (StreamWriter tw = new StreamWriter(@"C:\mycode\myapp\logs\log.txt"))
{
    // write a line of text to the file
    tw.Write("test");
    tw.Flush();
}

或者说我更喜欢
using (FileStream fs = new FileStream( @"C:\mycode\myapp\logs\log.txt"
                                     , FileMode.OpenOrCreate
                                     , FileAccess.ReadWrite)           )
{
    StreamWriter tw = new StreamWriter(fs);
    tw.Write("test");
    tw.Flush();
}

在你的第一段代码中,你不需要运行“tw.Flush()”。StreamWriter实现了IDisposable,这意味着当using块结束时,它会自动被处理。 - pedram bashiri
在你的第二段代码中,我也会使用“using”语句来创建“tw”,这样我就不必担心刷新/关闭它了。 - pedram bashiri
只有在自动模式下才会刷新,而我开始经常使用这种模式时并没有这个功能。这只是我在早期养成的习惯一直伴随着我的习惯。 - Tony Hopkinson

5
使用
System.IO.File.WriteAllText(@"path\te.txt", "text");

2
如果您知道输出内容不会太大,那么这是最佳答案。 - Andre Figueiredo

3
FileStream fs = new FileStream("d:\\demo.txt", FileMode.CreateNew,
                               FileAccess.Write);
StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.ASCII);
int data;

sw.Write("HelloWorld");

sw.Close();
fs.Close();
  • 问题在于当使用FileStream对象引用创建StreamWriter对象时,只要StreamWriter对象没有关闭,它就会一直期望某些数据。
  • 因此,在使用sw.Close();之后,您打开的文件将被关闭并准备好显示输出。

2

在VB.net中,这是不需要的。但是在CSharp中,似乎需要调用Writer.Flush()来强制进行写入操作。当然,调用Writer.Close()也会强制刷新缓冲区。

我们还可以设置StreamWriter实例的AutoFlush属性:

sw.AutoFlush = true;
// Gets or sets a value indicating whether the StreamWriter 
// will flush its buffer to the underlying stream after every  
// call to StreamWriter.Write.

来源: http://msdn.microsoft.com/zh-cn/library/system.io.streamwriter.autoflush(v=vs.110).aspx


0

一种替代方案

FileStream mystream = new FileStream("C:\\mycode\\myapp\\logs\\log.txt",    
FileMode.OpenOrCreate, FileAccess.Write);           
StreamWriter tw = new StreamWriter(mystream); 
tw.WriteLine("test");
tw.close();

0
尝试关闭文件或在行末添加\n
tw.WriteLine("test");
tw.Close();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接