c#在特定行号的文本文件中写入一行

时间:2016-03-29 10:56:56

标签: c# io

我在网上搜索但未能找到正确的例子。

目标是拥有一个功能:

private void InsertLine(string source, string position, string content)

使用StreamWriter写入文件,因此您不需要读取所有行,因为我的文件可能很大。

到目前为止我的功能:

    private void InsertLine(string source, string position, string content)
    {
        if (!File.Exists(source))
            throw new Exception(String.Format("Source:{0} does not exsists", source));

        var pos = GetPosition(position);
        int line_number = 0;
        string line;
        using (var fs = File.Open(source, FileMode.Open, FileAccess.ReadWrite))
                {
                    var destinationReader = new StreamReader(fs);
                    var writer = new StreamWriter(fs);
                    while (( line = destinationReader.ReadLine()) != null)
                    {
                      if (line_number == pos)
                        {
                            writer.WriteLine(content);
                            break;
                        }                            
                        line_number++;
                    }
                }
    }

该功能在文件中不起作用,因为没有任何反应。

2 个答案:

答案 0 :(得分:4)

您不能只是在文件中插入一行。文件是一个字节序列。

你需要:

  • 写下所有前面的行
  • 写下要插入的行
  • 写下以下所有行

这里有一些基于你的未经测试的代码:

private void InsertLine(string source, string position, string content)
{
    if (!File.Exists(source))
        throw new Exception(String.Format("Source:{0} does not exsists", source));

    // I don't know what all of this is for....
    var pos = GetPosition(position);
    int line_number = 0;
    string line;

    using (var fs = File.Open(source, FileMode.Open, FileAccess.ReadWrite))
    {
        var destinationReader = new StreamReader(fs);
        var writer = new StreamWriter(fs);
        while (( line = destinationReader.ReadLine()) != null)
        {
            writer.WriteLine(line);    // ADDED: You need to write every original line

            if (line_number == pos)
            {
                writer.WriteLine(content);
                // REMOVED the break; here. You need to write all following lines
            }

            line_number++;    // MOVED this out of the if {}. Always count lines.

        }

    }
}
但是,这可能不会像预期的那样奏效。您正在尝试写入您正在阅读的同一个文件。您应该打开一个新的(临时)文件,执行复制+插入,然后移动/重命名临时文件以替换原始文件。

答案 1 :(得分:-1)

此代码将帮助您在希望的行号上插入文本

    string path ="<Path of file>"
    List<string> lines = System.IO.File.ReadAllLines(path).ToList<string>();
    //give the line to be inserted
    lines[10]="New String";
    System.IO.File.WriteAllLines(path, lines);