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

C# 如何从文件中删除行而不覆盖新文件中的内容,c#,file,c#-4.0,file-io,c#-3.0,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:/tes

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

我尝试了以下方法

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"

我不知道该向读者介绍些什么。如果有其他方法,请提供解决方案。我只希望根据唯一文件名删除特定行。如果我的文件名是5.pdf,那么我需要删除或删除整行“filename=”5.pdf“…文件中的行。我不想再次覆盖新文件中的内容。给我一个解决方案。谢谢。

如果您不介意使用gnu工具,您可以使用sed

据我所知,这在技术上是不可能的,因为操作系统将创建一个新的IO工件。(顺便说一句,对此不是很确定)

但更重要的是,这是极其危险的。IO操作可能会失败,因此您必须以某种方式保证文件操作的一致性

其中一种可能的方法是:

  • 将所有行(要跳过的行除外)写入新的临时文件
  • 用其他临时名称重命名旧文件
  • 以上一个文件的名称重命名第一个临时文件
  • 删除原始文件

如果不重写文本文件,则无法从文本文件中重新插入一行。做这样的事

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

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

为什么不将什么内容写入新文件?你到底想要什么?从文件中删除一行而不写入文件。。。这毫无意义。。。预期的结果是什么?磁盘上的文件,行上的枚举器?我不想创建新文件。在同一个文件中覆盖是可以的。如果不重写文件,就不能从文本文件中重新插入一行。你可以做的最好的方法是通过一个SeCK()来从被移除的行的位置重写,但是你必须重写下面的行。也许你应该考虑使用一个擦除的标签/字符,并实现一个忽略这个字符的行的读取器。首先,确保你有SED可用。(从命令行键入sed并查看其是否为可识别的命令)。如果不是,请安装gnu工具(我假设您在windows上)。然后使用类似调用的系统(“sed/FileName=”“5\.pdf”“/d f:/test1”)或使用system.Diagnostics.Process类。当我执行最后一行文件时。writeallines(FileName,list.ToArray());错误消息显示为“访问被拒绝”。我拥有管理员权限。Help me.Thank.Access可能被拒绝,因为该文件仍在另一个应用程序中打开。关闭另一个应用程序。注意:我已经测试了代码示例。它对我有效。文件已打开,但我现在已关闭。它再次显示消息为“拒绝访问路径“C:\Test1.txt”。“谢谢。根目录在较新的windows版本中受保护。请尝试另一个。例如,
string filename=Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory),“Test1.txt”);
现在我尝试了F:。它工作正常。非常感谢。太好了。”。
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());
}