追加到新行不会转到新行

5 c# file-io appendtext

我试图将文本框中的文本附加到文本文件中的新行,但遇到了问题。假设文本文件中已经有内容,看起来像这样

something
Something
Something<---- Cursor ends here
Run Code Online (Sandbox Code Playgroud)

光标结束于箭头指向的位置(在最后一个“某事”上的 g 之后。如果我尝试使用

File.AppendAllLines(@"Location", new[]{tb.Text});
Run Code Online (Sandbox Code Playgroud)

或者

File.AppendAllText(@"Location", tb.Text + Environment.NewLine);
Run Code Online (Sandbox Code Playgroud)

他们会将文本放在光标所在的位置,而不是放在文本文件中最后一项下的新行上。如果光标一开始位于新行上,但一旦它在单词末尾结束,所有内容都会在同一行上,它会起作用。

我有什么遗漏的吗?使用流写入器或其他方法可以解决此问题吗?

len*_*kan 0

事实上,正如其他答案中指出的那样。这是设计使然。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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:长 readPosition = s.Length == 0 ?0:-1;用于处理空文件。