Streamwriter 仅从字符串列表中写入一定数量的字节
Streamwriter only writes a certain amount of bytes from a string list
我有 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"
行时相同的任意点被截断。
总结:
- 我正在尝试将字符串列表写入文件
- 所有必要的数据都在列表中
- 代码循环遍历列表中的所有数据
- 最终写入的文件不包含列表中的所有数据
谁能告诉我出了什么问题?我会尝试一种不同的方法来将内容写入文件,但我仍然想知道这里发生了什么以及我可以做些什么来防止它。
StreamWriter
class 有自己的缓冲区,如果您不 dispose/close 它,缓冲区的其余部分将会丢失,正如您所观察到的那样。
有多种方法可以刷新此缓冲区。
你可以明确地刷新它:
sw.Flush();
但这不是我想要给出的建议,相反,您应该处理 StreamWriter 实例,该实例也会将缓冲区刷新到基础流,并且作为一般准则,任何实现 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);
}
}
如果您想更深入地了解 StreamWriter
class 的工作原理,我建议您检查 Reference Source Code of StreamWriter.
我有 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"
行时相同的任意点被截断。
总结:
- 我正在尝试将字符串列表写入文件
- 所有必要的数据都在列表中
- 代码循环遍历列表中的所有数据
- 最终写入的文件不包含列表中的所有数据
谁能告诉我出了什么问题?我会尝试一种不同的方法来将内容写入文件,但我仍然想知道这里发生了什么以及我可以做些什么来防止它。
StreamWriter
class 有自己的缓冲区,如果您不 dispose/close 它,缓冲区的其余部分将会丢失,正如您所观察到的那样。
有多种方法可以刷新此缓冲区。
你可以明确地刷新它:
sw.Flush();
但这不是我想要给出的建议,相反,您应该处理 StreamWriter 实例,该实例也会将缓冲区刷新到基础流,并且作为一般准则,任何实现 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);
}
}
如果您想更深入地了解 StreamWriter
class 的工作原理,我建议您检查 Reference Source Code of StreamWriter.