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

本文关键字:文本 文件 列表 字符串 | 更新日期: 2023-09-27 18:05:25

我正试图从一个文本文件中读取并写入另一个。我读取的文件有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);
        }
    }

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

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

如果有选择的话,我将重写代码以使用Using{}块,当流超出作用域时,它将通过调用Dispose()自动关闭流。

最有可能的情况是,由于没有在写入器上调用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);
        }
    }
}

这就是实现细节非常重要的地方。基本上,当您写入StreamWriter时,您写入的文本不一定会提交到磁盘上的文件中。相反,它可以位于某个缓冲区中,该缓冲区必须被刷新才能提交到磁盘。这个缓冲区将由StreamWriter自己定期刷新。但是,如果您让进程在没有进行最后刷新的情况下终止,则缓冲区仍可能包含未提交的写操作。

因此,调用writer.Flush, writer.Close, writer.Dispose,或者最好的是,将StreamWriter的使用包装在using块中,以便为您处理。

同样,如果您不想关闭文件。可以使用flush

ReadLine()在该行不包含任何字符时返回空字符串…呼叫Flush()Close()…考虑使用using

你为什么不把文件作为一个整体复制(File.Copy)呢?