从源文本文件中的特定位置开始附加文本文件

时间:2014-04-16 19:52:04

标签: c# .net string streamreader streamwriter

我想在另一个文本文件中添加一个文本文件(比如说“append.txt”)(比如说“original.txt”),但不是在“original.txt”的最后一行/字符处。它应该从“original.txt”中的字符串的某个位置开始追加(比如说“匹配”)。并在“匹配”字符串的位置后忽略“original.txt”中的所有其他文本,并开始在“original.txt”文件中的“匹配”字符串位置附加“append.txt”文件。

我面临的问题是:

  1. 我无法在内存中加载整个文件,因为文件最多可达100 MB。因此,我决定使用StreamReader和StreamWriter,并逐行追加使用ReadLine和WriteLine,并在一行中获取目标字符串的位置,以找出从哪里开始追加过程。这是最好的方法吗?

  2. 我不想使用第三个临时文件(比如说“temporary.txt”)来获得最终文本,然后将“original.txt”替换为“temporary.txt”,因为文件大小转移很大。是否可以不使用第三个临时文件?

  3. 我目前的代码是:

    StreamReader TextFile = new StreamReader("original.txt");
    StreamReader TextFileAppend = new StreamReader("append.txt");
    StreamWriter TextFileTemp = new StreamWriter("temporary.txt");
    
    sLine = TextFile.ReadLine();
    
    while (!string.IsNullOrEmpty(sLine) && !TextFile.EndOfStream && !sLine.Contains("match"))
    {
        TextFileTemp.WriteLine(sLine);
        sLine = TextFile.ReadLine();
        TextFileTemp.WriteLine(sLine);
    }
    
    TextFile.Close();
    
    sLine = TextFileAppend.ReadLine();
    
    while (!string.IsNullOrEmpty(sLine) && !TextFileAppend.EndOfStream)
    {
        sLine = TextFileAppend.ReadLine();
        TextFileTemp.WriteLine(sLine);
    }
    
    TextFileTemp.Close();
    TextFileAppend.Close();
    
    File.Copy("temporary.txt", "original.txt", true);
    

    上面的代码工作正常,但需要一个临时的第三个文件来保存合并的内容,然后用合并的文本文件替换“original.txt”。

    代码中没有任何问题,但我想知道某个文件是否可以从某个位置追加而不是从末尾追加?

1 个答案:

答案 0 :(得分:1)

首先,100 Mb不会超出读取整个文件内容的范围到字符串然后使用内存函数更快。重要的是操纵像这样的大字符串可能很慢。

试试这个:

string originalContents = File.ReadAllText("original.txt");
string insertContents = File.ReadAllText("append.txt");
int index = originalContents .IndexOf("match");
if (index == -1) return;
FileStream stream = new FileStream("original.txt", FileMode.Open);
stream.Position = index;
byte[] insertBytes = Encoding.ASCII.GetBytes(insertContents);
stream.Write(insertBytes);
byte[] endBytes = Encoding.ASCII.GetBytes(originalContents.Substring(index));
stream.Write(endBytes);