为什么我的方法在末尾添加了一个额外的空行?

时间:2018-03-07 16:06:40

标签: c#

我使用下面的方法从文件中删除所有空白行但是由于某种原因在文档的末尾添加了额外的行?

var tempFileName = Path.GetTempFileName();
try
{
    using (var streamReader = new StreamReader(file))
        using (var streamWriter = new StreamWriter(tempFileName))
    {
        string line;
        while ((line = streamReader.ReadLine()) != null)
        {
            if (!string.IsNullOrWhiteSpace(line))
                streamWriter.WriteLine(line);
        }
    }
    File.Copy(tempFileName, file, true);
}
finally
{
    File.Delete(tempFileName);
}

我该如何解决这个问题?

还可以缩短代码吗?

3 个答案:

答案 0 :(得分:1)

  

还可以缩短代码吗?

另一个答案更有效的解决方案:

File.WriteAllLines(file, File.ReadLines("some/path").Where(l => !string.IsNullOrWhiteSpace(l)));

File.ReadLines()File.ReadAllLines()效率更高,因为它允许您查询IEnumerable<string>而无需先将其全部读入内存。

然后,我们从IEnumerable<string>方法中获取结果Where()并将其传递给File.WriteAllLines()的重载,其中IEnumerable<string>作为其第二个参数。

答案 1 :(得分:1)

StreamWriter.WriteLine()将始终在字符串后附加一个新行(回车符,换行符对),所以我认为这就是你所指的。对我来说,最后一行后跟一个新行是正常的,也是最好的。但如果你不想要它,就不要写一个。

就代码的长度而言,它看起来对我来说是正确的。如果它似乎有损程序逻辑,只需将其移动到自己的方法中即可。

为了提高效率,您可以尝试删除原始文件,然后重命名临时文件。这比复制整个文件更有效。

var tempFileName = Path.GetTempFileName();
try
{
    using (var streamReader = new StreamReader(file))
    using (var streamWriter = new StreamWriter(tempFileName))
    {
        string line;
        bool isFirstLine = true;
        while ((line = streamReader.ReadLine()) != null)
        {
            if (!string.IsNullOrWhiteSpace(line))
            {
                if (!isFirstLine)
                    streamWrite.WriteLine();
                streamWriter.Write(line);
                isFirstLine = false;
            }
        }
    }
    File.Delete(file);
    File.Move(tempFileName, file);
}
finally
{
    File.Delete(tempFileName);
}

答案 2 :(得分:0)

问题是StreamReader.ReadLine不会返回换行符,因此会破坏换行符信息。换句话说,那两个输入文件:

File 1: A\r\nB\r\n
File 2: A\r\nB

将为您的方法提供相同的输入。您无法确定是否存在最终换行符。

如果你不想要最后的换行符,请使用Write代替WriteLine,并在每次迭代中在循环开始时手动添加换行符,但第一行除外:

...
    string line;
    bool first = true;
    while ((line = streamReader.ReadLine()) != null)
    {
        if (string.IsNullOrWhiteSpace(line))
            continue;

        if (!first)
            streamWriter.WriteLine();

        streamWriter.Write(line);
        first = false;
    }
...