添加到新行不会转到新行

时间:2015-12-31 14:44:13

标签: c# file-io appendtext

我正在尝试将文本从文本框附加到文本文件中的新行并遇到问题。让我们说文本文件中已有内容,看起来像这样

something
Something
Something<---- Cursor ends here

光标在箭头指向的位置结束(在最后一个&g 39之后&#39;。如果我尝试使用

File.AppendAllLines(@"Location", new[]{tb.Text});

或者

File.AppendAllText(@"Location", tb.Text + Environment.NewLine);

它们会将文本放在光标所在的位置,而不是文本文件中最后一项下的新行。它是有效的,如果光标在一个新的行开始,但一旦它结束在单词的一切都在同一行。

我有什么遗失的东西吗?使用streamwriter或其他方法会解决这个问题吗?

5 个答案:

答案 0 :(得分:3)

它做你应该期待的。您的文本不会使用换行符初始化,因此它会在前一个文本结束的位置之后附加,为了解决您的问题,您可以在写入文件之前打开该文件并尝试读取最后一个字节。

bool addNewLine = true;
using (FileStream fs = new FileStream(@"location", FileMode.Open))
using (BinaryReader rd = new BinaryReader(fs))
{
    fs.Position = fs.Length - 1;
    int last = rd.Read();

    // The last byte is 10 if there is a LineFeed 
    if (last == 10)
        addNewLine = false;
}
string allLines = (addNewLine ? Environment.NewLine + tb.Text : tb.Text);
File.AppendAllLines(@"Location", new[]{allLines});

正如您所看到的那样复杂一点,但这样可以避免读取内存中的所有文件。

答案 1 :(得分:1)

如果您将Environment.NewLine放在文本的前面,它应该会为您提供您正在寻找的结果:

File.AppendAllText(@"Location", Environment.NewLine + tb.Text);

答案 2 :(得分:1)

这正是你要求做的。它会将您拥有的文本附加到现有文件中。如果该文件“错误”,则作者无法提供帮助。

如果文件完全由您控制,您可以确保始终将行结束写入文件。否则,您可以读取每一行,将其附加到其中,然后将整个文件写回。这显然对大文件不利:

File.WriteAllLines( @"Location"
                  , File.ReadAllLines(@"Location")
                    .Concat(new string[] { text })
                  );

答案 3 :(得分:1)

实际上,正如其他答案所指出的那样。这是设计的。 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;用于处理空文件。

答案 4 :(得分:0)

谢谢大家的建议,这就是我决定做的事情

FileStream stream = new FileStream("location", FileMode.Open, FileAccess.Read);
        char actual = '\0';
        if(stream.Length != 0)
        {
            stream.Seek(-1, SeekOrigin.End);
            var lastChar = (byte)stream.ReadByte();
            actual = (char)lastChar;
        }
        stream.Close();

        try {
            if(addCompT.Text != "")
            {

                if (actual == '\n' || actual == '\0')   
                    File.AppendAllText("location", addCompT.Text + Environment.NewLine);
                else
                    File.AppendAllText("location", Environment.NewLine + addCompT.Text + Environment.NewLine);

                addCompT.Text = "";
            }

        }
        catch(System.UnauthorizedAccessException)
        {
            MessageBox.Show("Please Run Program As Administrator!");
        }

感谢大家的帮助!