使用.NET在文件中间添加一行

14

你好,我正在做一个项目,需要将文本添加到一个 .txt 文件中。虽然我已经完成了这个任务,但遇到了一个小问题。我需要在文件的中间或者更靠近中间的位置写入字符串。例如:

Hello my name is Brandon,
I hope someone can help, //I want the string under this line.
Thank you.

希望有人能提供解决方案。

编辑 好的,谢谢各位,我会尝试着去解决,可能得重新写整个文件。好吧,我正在制作一个与hosts文件相关的程序,而不是每个人都有相同的hosts文件,所以我想知道是否有一种方法可以读取他们的hosts文件并将其复制,同时添加字符串到该文件中?


你知道 StreamWriter 是 .NET 框架的一部分,而不是 C# 编程语言的一部分吗? - John Saunders
6个回答

19

对于常规文件,无法绕过这个问题 - 您必须读取要附加到其后的文本,覆盖文件,然后附加原始尾随文本。

将磁盘上的文件视为数组 - 如果您想在数组的中间插入一些项,则需要将所有后续项向下移动以腾出空间。不同之处在于,.NET为数组和Lists提供了方便的方法,使此操作易于执行。就我所知,文件I/O API没有提供此类方便的方法。

当您事先知道需要在文件中间插入内容时,通常更容易仅编写具有更改内容的新文件,然后执行重命名。 如果文件足够小而可以读入内存,则可以使用一些LINQ轻松完成此操作:

var allLines = File.ReadAllLines( filename ).ToList();
allLines.Insert( insertPos, "This is a new line..." );
File.WriteAllLines( filename, allLines.ToArray() );

4

这是在文本文件中插入文本的最佳方法。

 string[] full_file = File.ReadAllLines("test.txt");
 List<string> l = new List<string>();
 l.AddRange(full_file);
 l.Insert(20, "Inserted String"); 
 File.WriteAllLines("test.txt", l.ToArray());

这种方法并不是最好的。在结束时,每行文本都有3个数据结构,并且存在中间列表插入。它不够高效,因此不能被称为“最佳”。 - Ronnie Overby

3

其中一个技巧是文件事务。首先,您需要读取文件直到要添加文本的行,但在读取时,请将读取的行保存在另一个文件(例如tmp.txt)中,然后将所需的文本添加到tmp.txt中(在文件末尾)。之后,继续从源文件读取直到结尾。然后用tmp.txt替换源文件。最终,您将得到在文件中间添加了文本的文件 :)


2

请查看File.ReadAllLines(),这可能是最简单的方法。

     string[] full_file = File.ReadAllLines("test.txt");
     List<string> l = new List<string>();
     l.AddRange(full_file);
     l.Insert(20, "Inserted String");
     File.WriteAllLines("test.txt", l.ToArray());

0

如果您知道行索引,请使用readLine直到达到该行并在其下面写入。

如果您确切地知道该行的文本,请执行相同的操作,但将从readLine返回的文本与您要搜索的文本进行比较,然后在该行下面写入。

或者,您可以搜索指定字符串的索引,并使用转义序列\n在其后面进行编写。


0

正如其他人所提到的,如果您必须坚持使用简单的文本文件,则在新插入的文本点之后重写文件是无法避免的。不过,根据您的要求,可能有可能加快查找开始写入位置的速度。如果您知道需要在第N行后添加数据,则可以维护一个单独的“索引”,其中包含行号的偏移量。这将使您能够直接定位到必要的位置以开始读取/写入。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接