字符串列表不会完全写入文本文件

时间:2011-08-14 03:49:35

标签: c# .net stream

我试图从一个文本文件中读取并写入另一个文本文件。 Im读取的文件有2023行,而我写的文件只有2008行。我无法弄清楚另一条线上发生了什么......我在某处失去了它们。我做错了什么?

谢谢!

继承我在C#中的代码。

     static void Main(string[] args)
    {
        StreamWriter writer = new StreamWriter("C:/Users/Rafael/desktop/newfile.txt");
        StreamReader reader = new StreamReader("C:/Users/Rafael/desktop/new1.txt");//, System.Text.Encoding.GetEncoding("ISO-8859-1"));
        string line;
        while ((line = reader.ReadLine()) != null)
        {

            writer.WriteLine(line);
        }

    }

6 个答案:

答案 0 :(得分:9)

这里没有关闭编写器 - 因此可能无法写入文件。你可以通过在循环后调用Close()来测试它,或者如果你还没有完成文件,你可以使用Flush()。

如果有选择,我会重写代码以使用Using{}块,当它们超出范围时,通过调用Dispose()自动关闭流。

答案 1 :(得分:5)

最有可能的是输出没有被刷新,因为你没有在编写器上调用Dispose(),所以缓冲的输出被丢弃了。

当您使用以这种方式实现IDisposable的类时,应始终将它们包装在using块中:

static void Main(string[] args)
{
    using (StreamWriter writer = new StreamWriter("C:/Users/Rafael/desktop/newfile.txt"))
    using (StreamReader reader = new StreamReader("C:/Users/Rafael/desktop/new1.txt"))
    {
        string line;
        while ((line = reader.ReadLine()) != null)
        {

            writer.WriteLine(line);
        }
    }
}

答案 2 :(得分:3)

这是实施细节很重要的地方。基本上,当您写入StreamWriter时,您编写的文本不一定会提交到磁盘上的文件。相反,它可能位于某个缓冲区中,并且必须刷新缓冲区才能将其提交到磁盘。 {(1}}本身会定期刷新此缓冲区。但是如果你让你的进程终止而不进行最后的刷新,缓冲区仍然可以保存未提交的写入。

所以,请致电StreamWriterwriter.Flushwriter.Close,或者最重要的是,在writer.Dispose块中使用StreamWriter,以便它为你而处置。

答案 3 :(得分:2)

另外,如果您不想关闭该文件。您可以使用flush

答案 4 :(得分:1)

当该行不包含任何字符时,

ReadLine()返回一个空字符串... 致电Flush()Close() ...考虑使用using ...

为什么不直接复制整个文件(File.Copy)?

答案 5 :(得分:0)

循环后在编写器上调用Flush()