C#SteamWriter未正确终止文件

时间:2015-12-06 14:15:31

标签: c# streamwriter

我在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);
        }
    }
}

问题是它不会在最后一行之后终止文件。例如,如果最后一行是&#34; text = absolute&#34;,则用&#34替换最后一行; tempor&#34;并且使用上述方法保存,文件的最后一行将是&#34; tempor absolute&#34;而不只是&#34; tempor&#34;。

如果您需要更多信息,请与我们联系。

编辑:我会尝试更清楚地解释替换过程中会发生什么。

第1步:使用File.ReadAllLines(字符串)加载任何.txt文件;

第2步:将最后一行替换为比前一行短的行。例如,如果最后一个值的长度为10个字符,则新字符的长度应为7个字符 第3步:使用给定方法保存到以前的相同文件。

1 个答案:

答案 0 :(得分:2)

正如评论所建议的那样,在这种情况下的最佳解决方案是保持简单并依赖于可靠的解决方案。例如:

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不包括最终新行的要求。