为什么 StreamWriter 添加了一个额外的空行而 File.WriteAllLine 没有?
Why is StreamWriter adding in an extra blank line while File.WriteAllLine does not?
我最初使用 File.WriteAllLines 将大量记录写入本地文本文件。此列表设置为扩展,因此为了避免任何内存问题,我决定遵循 SqlClient Streaming Support MSDN Article 中给出的建议。我当前使用的更改代码包含在下面。
using (FileStream destFile = new FileStream(
destinationFilePath, FileMode.Create, FileAccess.Write))
{
using (SqlDataReader reader = await command.ExecuteReaderAsync(CommandBehavior.SequentialAccess))
{
using (StreamWriter writer = new StreamWriter(destFile))
{
while (await reader.ReadAsync())
{
char[] buffer = new char[4096];
int charsRead = 0;
using (TextReader data = reader.GetTextReader(0))
{
do
{
charsRead = await data.ReadAsync(buffer, 0, buffer.Length);
await writer.WriteLineAsync(buffer, 0, charsRead);
}
while (charsRead > 0);
}
}
}
}
}
由于 运行 此代码(使用 writer.WriteLineAsync)创建的文件 在每条记录之间包含一个不需要的空行 ,尽管输出的数据是正确的。最初我将 SqlQuery method 与 foreach 循环一起使用,并将每条记录添加到通用集合中。然后我使用 File.WriteAllLines 将记录输出到指定的文件,记录被 格式化,它们之间没有空行 ( 期望的结果 ).
为了尝试解决这个问题(而不是使用 writer.WriteLineAsync),然后我尝试使用
writer.WriteAsync
但所有文本都输出到一行。
我研究了 Whosebug 以寻求一些建议,并发现了建议使用
的帖子
writer.NewLine ="\n\r" or writer.NewLine ="\r"
不幸的是,这并没有解决问题。在此问题上,我们将不胜感激任何帮助或建议。提前致谢。
那是因为:
charsRead = await data.ReadAsync(buffer, 0, buffer.Length);
await writer.WriteLineAsync(buffer, 0, charsRead);
只要charsRead
是0
,你还是写一行。改成
charsRead = await data.ReadAsync(buffer, 0, buffer.Length);
if (charsRead > 0)
await writer.WriteLineAsync(buffer, 0, charsRead);
或者,如果您想为每条记录写一行,请将其更改为:
do
{
charsRead = await data.ReadAsync(buffer, 0, buffer.Length);
if (charsRead > 0)
await writer.WriteAsync(buffer, 0, charsRead);
}
while (charsRead > 0);
await writer.WriteLineAsync(buffer, 0, 0);
我最初使用 File.WriteAllLines 将大量记录写入本地文本文件。此列表设置为扩展,因此为了避免任何内存问题,我决定遵循 SqlClient Streaming Support MSDN Article 中给出的建议。我当前使用的更改代码包含在下面。
using (FileStream destFile = new FileStream(
destinationFilePath, FileMode.Create, FileAccess.Write))
{
using (SqlDataReader reader = await command.ExecuteReaderAsync(CommandBehavior.SequentialAccess))
{
using (StreamWriter writer = new StreamWriter(destFile))
{
while (await reader.ReadAsync())
{
char[] buffer = new char[4096];
int charsRead = 0;
using (TextReader data = reader.GetTextReader(0))
{
do
{
charsRead = await data.ReadAsync(buffer, 0, buffer.Length);
await writer.WriteLineAsync(buffer, 0, charsRead);
}
while (charsRead > 0);
}
}
}
}
}
由于 运行 此代码(使用 writer.WriteLineAsync)创建的文件 在每条记录之间包含一个不需要的空行 ,尽管输出的数据是正确的。最初我将 SqlQuery method 与 foreach 循环一起使用,并将每条记录添加到通用集合中。然后我使用 File.WriteAllLines 将记录输出到指定的文件,记录被 格式化,它们之间没有空行 ( 期望的结果 ).
为了尝试解决这个问题(而不是使用 writer.WriteLineAsync),然后我尝试使用
writer.WriteAsync
但所有文本都输出到一行。
我研究了 Whosebug 以寻求一些建议,并发现了建议使用
的帖子writer.NewLine ="\n\r" or writer.NewLine ="\r"
不幸的是,这并没有解决问题。在此问题上,我们将不胜感激任何帮助或建议。提前致谢。
那是因为:
charsRead = await data.ReadAsync(buffer, 0, buffer.Length);
await writer.WriteLineAsync(buffer, 0, charsRead);
只要charsRead
是0
,你还是写一行。改成
charsRead = await data.ReadAsync(buffer, 0, buffer.Length);
if (charsRead > 0)
await writer.WriteLineAsync(buffer, 0, charsRead);
或者,如果您想为每条记录写一行,请将其更改为:
do
{
charsRead = await data.ReadAsync(buffer, 0, buffer.Length);
if (charsRead > 0)
await writer.WriteAsync(buffer, 0, charsRead);
}
while (charsRead > 0);
await writer.WriteLineAsync(buffer, 0, 0);