Streamwriter只从字符串列表中

时间:2015-08-18 09:46:39

标签: c# list file-read

我有27个csv文件,其中包含员工时间表数据,总共约有2000行数据,并且日益增长。

我正在编写一个应用程序,它将每个文件中的数据编译为单个csv文件,以便在Excel中进行分析。我这样做是通过读取每个文件,将其内容写入字符串列表,然后将字符串列表写入新文件。下面是将列表写入文件的代码:

FileStream fs = new FileStream(saveFileDialog1.FileName, FileMode.CreateNew, FileAccess.ReadWrite);
StreamWriter sw = new StreamWriter(fs);
foreach (string l in reader)//reader is a List<string> pouplated earlier
{
    sw.WriteLine(l);
}
fs.Close();

reader是一个包含大约1170行时间表条目的列表。当我查询reader的所有数据时,所有数据都存在。

当我打开已编译的csv时出现问题,除最后一个时间表文件的最后几行外,所有数据都存在。编译后的文件只包含1167个完整行,其中第1168行在某个任意点被截断。在仔细检查具有不同内容的不同文件后,我注意到每个文件的大小正好是160840字节。

出于调试目的,我修改了这样的代码:

string line = "";//A string to test whether the foreach loop completes
FileStream fs = new FileStream(saveFileDialog1.FileName, FileMode.CreateNew, FileAccess.ReadWrite);
StreamWriter sw = new StreamWriter(fs);
foreach (string l in reader)//reader is a List<string> pouplated earlier
{
    line = l;
    sw.WriteLine(line);
    sw.WriteLine("testline")//write random content to see if it has effect on the data
}
fs.Close();
MessageBox.Show(line);

通过此修改,运行代码后弹出的消息显示应该写入文件的正确条目(但不是);这证明foreach循环遍历所有数据。编译后的文件现在具有大约200kB的更大尺寸。当我仔细检查它时,添加了所有"testline"行,实际的时间表条目仍然在与未写入"testline"行时相同的任意点处切断。

总结:

  • 我正在尝试将字符串列表写入文件
  • 列表中包含所有必要的数据
  • 代码循环遍历列表中的所有数据
  • 最终的书面文件不包含列表中的所有数据

有人可以告诉我出了什么问题吗?我将尝试一种不同的方法将内容写入文件,但我仍然想知道这里发生了什么以及我可以做些什么来防止它。

1 个答案:

答案 0 :(得分:2)

StreamWriter类有自己的缓冲区,如果你不处理/关闭它,缓冲区的其余部分将会丢失,正如你所观察到的那样。

有多种方法可以刷新此缓冲区。

你可以明确地冲洗它:

sw.Flush();

但这不是我想要给出的建议,而是你应该处理StreamWriter实例,它也将缓冲区刷新到底层流,并作为一般准则,任何实现{{1当你完成它时应该被处理掉。

所以修改你的代码:

IDisposable

如果您想深入了解using (FileStream fs = new FileStream(saveFileDialog1.FileName, FileMode.CreateNew, FileAccess.ReadWrite)) using (StreamWriter sw = new StreamWriter(fs)) { foreach (string l in reader)//reader is a List<string> pouplated earlier { sw.WriteLine(l); } } 课程的工作方式,我建议您查看Reference Source Code of StreamWriter