从源文本文件中的某个位置开始追加一个文本文件
本文关键字:文件 文本 追加 一个 开始 位置 | 更新日期: 2023-09-27 17:58:50
我想在另一个文本文件(比如"original.txt")中附加一个文本(比如"append.txt"从"match"字符串在"original.txt"文件中的位置。
我面临的问题是:
-
我无法在内存中加载整个文件,因为这些文件最多可以达到100MB。因此,我决定使用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"。
代码中没有任何错误,但我想知道是否可以从某个位置而不是从末尾附加文件?
首先,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);