如何从文件中删除一行而不覆盖新文件中的内容

时间:2012-10-01 13:58:10

标签: c# file c#-4.0 file-io c#-3.0

FileName="1.pdf",filepath="f:/test1"
FileName="2.pdf",filepath="f:/test2"
FileName="3.pdf",filepath="f:/test3"
FileName="4.pdf",filepath="f:/test4"
FileName="5.pdf",filepath="f:/test5"
FileName="6.pdf",filepath="f:/test6"

我不想创建新文件。在同一个文件中覆盖是可以的

我尝试了以下内容。

var reader = File.OpenText("f:/test5");
reader. // ?

我不知道读者后要放什么。如果有任何替代方法,请为我​​提供解决方案。我想根据唯一文件名仅删除特定行。如果我有5.pdf作为文件名,那么我需要从文件中删除或删除整行“FileName =”5.pdf“...行。我不想覆盖一个文件中的内容再次提交新文件。给我一个解决方案。谢谢。

4 个答案:

答案 0 :(得分:1)

如果不覆盖文件,则无法从文本文件中删除行。做这样的事情

string filename =
   Path.Combine(
       Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory),
       "Test1.txt");

string[] lines = File.ReadAllLines(filename);
var list = new List<string>(lines);
list.RemoveAt(4);
File.WriteAllLines(filename, list.ToArray());

编辑:

您可以找到具有特定文件名的行,如下所示:

int index = list.FindIndex(s => s.EndsWith("/test5\""));
// Or whatever test is appropriate.

if (index >= 0) {
    list.RemoveAt(index);
    File.WriteAllLines(filename, list.ToArray());
}

答案 1 :(得分:0)

如果您不介意使用gnu工具,可以使用sed http://en.kioskea.net/faq/1451-sed-delete-one-or-more-lines-from-a-file

答案 2 :(得分:0)

技术上不可能,就像我所知道的那样,因为操作系统会创建一个新的IO工件。(顺便说一句,这个不是很确定)。

但更重要的是,非常危险。 IO操作是失败的主题,因此您必须以某种方式保证您的操作存档一致性

这样做的一种可行方法是:

  • 将除要跳过的所有行写入新的TEMP文件
  • 使用其他临时名称重命名旧文件
  • 在前一个文件的名称中重命名fisrt TEMP文件
  • 删除原始文件。

答案 3 :(得分:0)

无论您使用什么实用程序或编写什么代码,操作系统都会创建一个新文件来执行此操作。