实际上,正如其他答案中指出的那样。这是设计使然。File.AppendAllLines 在文件末尾追加文本。它不会在附加文本之前添加换行符。为此,您必须以某种方式读取文件并确定最后一个字符是否为换行符。有多种方法可以做到这一点。
最简单的方法是读取所有行并检查最后一行是否为空。如果没有,只需在将字符串传递给 File.AppendAllLines 之前为其添加一个换行符。
但是,如果处理大文件,或者您不想多次打开文件 - 类似以下方法的方法将执行此操作,同时仍只打开一次文件。
public void AppendAllLinesAtNewLine(string path, IEnumerable<string> content)
{
// No file, just append as usual.
if (!File.Exists(path))
{
File.AppendAllLines(path, content);
return;
}
using (var stream = File.Open(path, FileMode.Open, FileAccess.ReadWrite))
using (var reader = new StreamReader(stream))
using (var writer = new StreamWriter(stream))
{
// Determines if there is a new line at the end of the file. If not, one is appended.
long readPosition = stream.Length == 0 ? 0 : -1;
stream.Seek(readPosition, SeekOrigin.End);
string end = reader.ReadToEnd();
if (end.Length != 0 && !end.Equals("\n", StringComparison.Ordinal))
{
writer.Write(Environment.NewLine);
}
// Simple write all lines.
foreach (var line in content)
{
writer.WriteLine(line);
}
}
}
注意:长 readPosition = s.Length == 0 ?0:-1;用于处理空文件。