14

当我使用 System.IO.File.WriteAllLines 保存 String[] 数组的内容时,文件末尾总是留有一个空行。例如:

System.IO.File.WriteAllLines(Application.dataPath + "/test.txt",["a", "b", "c"]);

生成文件(不带下划线):

a
b
c
_

已经有这样的话题:.Net File.WriteAllLines 中的空行,是错误吗?,但作者说“我认为我的数据有问题,这是我的问题,但不是 WritAllLines”,它被关闭为“过于本地化”(?!?)。

这是一个错误?我怎样才能轻松摆脱它(现在我只是在再次读取文件时忽略它)?

4

9 回答 9

15

正如其他人指出的那样,这就是它的工作原理。这是一种无需额外换行符的方法:

public static class FileExt
{
    public static void WriteAllLinesBetter(string path, params string[] lines)
    {
        if (path == null)
            throw new ArgumentNullException("path");
        if (lines == null)
            throw new ArgumentNullException("lines");

        using (var stream = File.OpenWrite(path))
        using (StreamWriter writer = new StreamWriter(stream))
        {
            if (lines.Length > 0)
            {
                for (int i = 0; i < lines.Length - 1; i++)
                {
                    writer.WriteLine(lines[i]);
                }
                writer.Write(lines[lines.Length - 1]);
            }
        }
    }
}

用法:

FileExt.WriteAllLinesBetter("test.txt", "a", "b", "c");

写道:

一个enter
_enter
C
于 2012-07-27T14:14:56.960 回答
9

WriteAllLines方法将写出数组中的每一行,然后是换行符。这意味着您将始终在文件中获得此“空行”。

您链接的帖子中的要点是,在运行时ReadAllLines认为一行是由换行符终止的字符。因此,当您对刚刚编写的文件使用 read 方法时,您应该得到完全相同的行。

如果您以不同的方式读取文件,那么您将不得不自己处理换行符。

本质上,您所看到的是预期行为。

于 2012-07-27T14:08:58.653 回答
5

您还可以使用 WriteAllText 保存文件并手动加入行数组,例如:

File.WriteAllText(file, String.Join("\r\n",correctedLines));
于 2019-09-25T07:12:14.170 回答
4

@Virtlink 解决方案几乎是完美的。事实上,有一种情况会在文件末尾出现垃圾 - 当文件存在并且其内容大于新内容时。在写入新文件内容之前,只需将文件长度重置为零。

    public static void WriteAllLinesBetter(string path, params string[] lines)
    {
        if (path == null)
            throw new ArgumentNullException("path");
        if (lines == null)
            throw new ArgumentNullException("lines");

        using (var stream = File.OpenWrite(path))
        {
            stream.SetLength(0);
            using (var writer = new StreamWriter(stream))
            {
                if (lines.Length > 0)
                {
                    for (var i = 0; i < lines.Length - 1; i++)
                    {
                        writer.WriteLine(lines[i]);
                    }
                    writer.Write(lines[lines.Length - 1]);
                }
            }
        }
    }
于 2017-02-03T22:46:09.187 回答
3

WriteAllLines 写入数组中的每个条目并附加一个换行符。
如您所见,每个字符串都在其自己的行上,这意味着您的最后一个条目以换行符终止,并且您在文件中看到多行。您可以通过文件的十六进制转储来证明这一点

查看 WriteAllLines 的源代码可以证实这一点。
在内部,它使用TextWriter.WriteLine(string)方法。

于 2012-07-27T14:08:42.493 回答
3

有一个更简单的解决方法:

// 1. Convert the items on the array to single string with the separator "\n" between the items
string AllItemsInOneString= string.Join("\n", StringArrayToSave);

// 2. Save with WriteAllText instead
File.WriteAllText(FilePath, AllItemsInOneString);
于 2019-08-13T18:16:19.850 回答
0

我做了同样的事情,只是添加了一行:3,希望对某人有所帮助

    for(int i = 0; i < Length; i++)
    {
        line = getLocation(i).X.ToString("0.0", nfi) + ',' + getLocation(i).Y.ToString("0.000", nfi) + ',' + getColorRaw(i).R.ToString("0.000", nfi) + ',' + getColorRaw(i).G.ToString("0.000", nfi) + ',' + getColorRaw(i).B.ToString("0.000", nfi);
        writer.Write(line);
        if( i < Length - 1) writer.Write("\n");
于 2013-04-20T03:59:26.210 回答
0

为了摆脱尾随的换行符,最好的解决方案是,当您阅读它时.ReadAllLines(),实际上消除了字符串数组中的最后一个元素。

于 2014-06-13T22:53:32.733 回答
0

我最简单的方法是在最后一行使用 AppendAllText:

if ($i -ne $lines.Count - 1){
     $newLines += $lines[$i]
    } else {
     $lastLine = $lines[$i]
}

[IO.File]::WriteAllLines($file.FullName, $newLines);
[IO.File]::AppendAllText($file.FullName, $lastLine);
于 2016-09-13T10:08:12.020 回答