C# StreamWriter 没有正确终止文件
C# SteamWriter not terminating file correctly
我在 C# 中有以下代码,可将行数组写入文件。这个和File.WriteAllLines(string, string[]);
的区别是我的没有在最后多留一个换行符。
public static void WriteAllLinesCompact(string path, IEnumerable<string> contents)
{
if (path == null)
throw new ArgumentNullException("path");
if (contents == null)
throw new ArgumentNullException("contents");
bool isFirst = true;
using (FileStream stream = File.OpenWrite(path))
using (StreamWriter writer = new StreamWriter(stream))
{
foreach (string line in contents)
{
if (isFirst)
{
writer.Write(line);
isFirst = false;
continue;
}
writer.Write("\r\n" + line);
}
}
}
问题是它不会在最后一行之后终止文件。例如,如果最后一行是 "text = absolute",将最后一行替换为 "tempor" 并使用上述方法保存后,文件的最后一行将是 "tempor absolute" 而不是 "tempor" ].
如果您需要更多信息,请告诉我。
编辑:我将尝试更清楚地解释替换过程中发生的事情。
步骤 1:使用 File.ReadAllLines(string);
加载任何 .txt 文件
第 2 步:将最后一行替换为比上一行短的行。例如,如果最后一个值的长度是 10 个字符,那么新值可能应该是 7 个字符。
第 3 步:使用给定的方法保存到与以前相同的文件。
正如评论所建议的那样,在这种情况下最好的解决方案是保持简单并依赖于可靠的解决方案。例如:
bool isFirst = true;
using (StreamWriter writer = new StreamWriter(path))
{
foreach (string line in contents)
{
if (isFirst)
{
writer.Write(line);
isFirst = false;
continue;
}
writer.Write(Environment.NewLine + line);
}
}
就我个人而言,我更愿意使用 writer.WriteLine
,但这会违反 OP 不包括最后一个新行的要求。
我在 C# 中有以下代码,可将行数组写入文件。这个和File.WriteAllLines(string, string[]);
的区别是我的没有在最后多留一个换行符。
public static void WriteAllLinesCompact(string path, IEnumerable<string> contents)
{
if (path == null)
throw new ArgumentNullException("path");
if (contents == null)
throw new ArgumentNullException("contents");
bool isFirst = true;
using (FileStream stream = File.OpenWrite(path))
using (StreamWriter writer = new StreamWriter(stream))
{
foreach (string line in contents)
{
if (isFirst)
{
writer.Write(line);
isFirst = false;
continue;
}
writer.Write("\r\n" + line);
}
}
}
问题是它不会在最后一行之后终止文件。例如,如果最后一行是 "text = absolute",将最后一行替换为 "tempor" 并使用上述方法保存后,文件的最后一行将是 "tempor absolute" 而不是 "tempor" ].
如果您需要更多信息,请告诉我。
编辑:我将尝试更清楚地解释替换过程中发生的事情。
步骤 1:使用 File.ReadAllLines(string);
加载任何 .txt 文件
第 2 步:将最后一行替换为比上一行短的行。例如,如果最后一个值的长度是 10 个字符,那么新值可能应该是 7 个字符。
第 3 步:使用给定的方法保存到与以前相同的文件。
正如评论所建议的那样,在这种情况下最好的解决方案是保持简单并依赖于可靠的解决方案。例如:
bool isFirst = true;
using (StreamWriter writer = new StreamWriter(path))
{
foreach (string line in contents)
{
if (isFirst)
{
writer.Write(line);
isFirst = false;
continue;
}
writer.Write(Environment.NewLine + line);
}
}
就我个人而言,我更愿意使用 writer.WriteLine
,但这会违反 OP 不包括最后一个新行的要求。