在C#中编辑文本文件的特定行

我有两个文本文件,Source.txt和Target.txt。源将永远不会被修改并且包含N行文本。因此,我想删除Target.txt中的特定文本行,并用Source.txt中的特定文本行替换,我知道我需要多少行,实际上是第2行,两个文件。

我还没有这样的东西:

string line = string.Empty;

int line_number = 1;

int line_to_edit = 2;

using (StreamReader reader = new StreamReader(@"C:\source.xml"))

{

using (StreamWriter writer = new StreamWriter(@"C:\target.xml"))

{

while ((line = reader.ReadLine()) != null)

{

if (line_number == line_to_edit)

{

writer.WriteLine(line);

}

line_number++;

}

}

}

但是,当我打开Writer时,目标文件将被擦除,并写入行,但是当打开时,目标文件仅包含复制的行,其余的行将丢失。

我能做什么?

回答:

您不能在不重写整个文件的情况下重写一行(除非这些行的长度相同)。如果文件较小,则将整个目标文件读入内存,然后再次将其写出。您可以这样做:

using System;

using System.IO;

class Program

{

static void Main(string[] args)

{

int line_to_edit = 2; // Warning: 1-based indexing!

string sourceFile = "source.txt";

string destinationFile = "target.txt";

// Read the appropriate line from the file.

string lineToWrite = null;

using (StreamReader reader = new StreamReader(sourceFile))

{

for (int i = 1; i <= line_to_edit; ++i)

lineToWrite = reader.ReadLine();

}

if (lineToWrite == null)

throw new InvalidDataException("Line does not exist in " + sourceFile);

// Read the old file.

string[] lines = File.ReadAllLines(destinationFile);

// Write the new file over the old file.

using (StreamWriter writer = new StreamWriter(destinationFile))

{

for (int currentLine = 1; currentLine <= lines.Length; ++currentLine)

{

if (currentLine == line_to_edit)

{

writer.WriteLine(lineToWrite);

}

else

{

writer.WriteLine(lines[currentLine - 1]);

}

}

}

}

}

如果文件很大,最好创建一个新文件,以便您可以在写入另一个文件时读取其中一个文件的流。这意味着您不需要一次将整个文件存储在内存中。您可以这样做:

using System;

using System.IO;

class Program

{

static void Main(string[] args)

{

int line_to_edit = 2;

string sourceFile = "source.txt";

string destinationFile = "target.txt";

string tempFile = "target2.txt";

// Read the appropriate line from the file.

string lineToWrite = null;

using (StreamReader reader = new StreamReader(sourceFile))

{

for (int i = 1; i <= line_to_edit; ++i)

lineToWrite = reader.ReadLine();

}

if (lineToWrite == null)

throw new InvalidDataException("Line does not exist in " + sourceFile);

// Read from the target file and write to a new file.

int line_number = 1;

string line = null;

using (StreamReader reader = new StreamReader(destinationFile))

using (StreamWriter writer = new StreamWriter(tempFile))

{

while ((line = reader.ReadLine()) != null)

{

if (line_number == line_to_edit)

{

writer.WriteLine(lineToWrite);

}

else

{

writer.WriteLine(line);

}

line_number++;

}

}

// TODO: Delete the old file and replace it with the new file here.

}

}

一旦确定写入操作成功(没有引发异常并且关闭了写入器),则可以随后移动文件。

请注意,在这两种情况下,对于行号都使用基于1的索引会有点令人困惑。在代码中使用基于0的索引可能更有意义。如果需要,您可以在程序的用户界面中使用基于1的索引,但是在将其进一步发送之前,请将其转换为0索引。

同样,用新文件直接覆盖旧文件的一个缺点是,如果中途失败,则可能会永久丢失所有未写入的数据。通过首先写入第三个文件,您仅在确定拥有另一个(更正的)副本后才删除原始数据,因此,如果计算机在中途崩溃,则可以恢复该数据。

最后一点:我注意到您的文件具有xml扩展名。您可能要考虑使用XML解析器修改文件内容而不是替换特定行是否更有意义。

以上是 在C#中编辑文本文件的特定行 的全部内容, 来源链接: utcz.com/qa/408275.html

回到顶部