我想在另一个文本文件中添加一个文本文件(比如说“append.txt”)(比如说“original.txt”),但不是在“original.txt”的最后一行/字符处。它应该从“original.txt”中的字符串的某个位置开始追加(比如说“匹配”)。并在“匹配”字符串的位置后忽略“original.txt”中的所有其他文本,并开始在“original.txt”文件中的“匹配”字符串位置附加“append.txt”文件。
我面临的问题是:
我无法在内存中加载整个文件,因为文件最多可达100 MB。因此,我决定使用StreamReader和StreamWriter,并逐行追加使用ReadLine和WriteLine,并在一行中获取目标字符串的位置,以找出从哪里开始追加过程。这是最好的方法吗?
我不想使用第三个临时文件(比如说“temporary.txt”)来获得最终文本,然后将“original.txt”替换为“temporary.txt”,因为文件大小转移很大。是否可以不使用第三个临时文件?
我目前的代码是:
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”。
代码中没有任何问题,但我想知道某个文件是否可以从某个位置追加而不是从末尾追加?
答案 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);