2012-05-16 220 views
0

我目前正在开发一个项目,我必须从文本文件中删除特定的文本行。从from.txt文件中删除文本行

这是我的代码已经:

static void Main(string[] args) 
    { 
     string line = null; 
     string line_to_delete = "--"; 
     string desktopLocation = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); 
     string text = Path.Combine(desktopLocation, "tim3.txt"); 
     string file = Path.Combine(desktopLocation, "tim4.txt"); 

     using (StreamReader reader = new StreamReader(text)) 
     { 
      using (StreamWriter writer = new StreamWriter(file)) 
      { 
       while((line = reader.ReadLine()) != null) 
       { 
        if (string.Compare(line, line_to_delete) == 0) 
         continue; 
        writer.WriteLine(line); 
       } 
      } 

这仅写入文本到一个新的txt文件,但犯规删除任何东西。

谢谢。 主要问题是我只需要删除txt文件中的特定行文本。

+0

你有没有运行到调试?这应该很容易解决 – CharlesB

+0

嗯,我没有得到任何错误,但是当我运行它时,它只会将第一个文本文件复制到第二个文件。它不删除我指定的文本或字符。 –

+0

考虑行结束。显示输入数据。调试可以帮助您了解字符串中的不同以及比较器为什么找不到等于字符串 – gabba

回答

0

我怀疑领导/培训空间,这是造成String.comapre返回意想不到的结果

而不是

if (string.Compare(line, line_to_delete) == 0) 

尝试

if(String.IsNullOrEmpty(line) || String.Equals(line.Trim(), line_to_delete)) 

如上不工作,你可以尝试以下(LINQ)

编辑 - 仅替换文本

File.WriteAllText(file, File.ReadAllText(text).Replace(line_to_delete,"")) 

如果上述作品,它将替换所有使用块在你的代码

如果上述方法无效,我怀疑它是数据的问题(“__”不是在文本存在文件)

+0

String.IsNullOrEmpty(line)|| 会跳过空行,我认为它是不正确 – gabba

+0

我只是试过这段代码,但它给了我相同的结果。它只是再次写入相同的文本。 –

+1

很难理解发生了什么。我会尝试在由line.Contains(line_to_delete)调整的if行上放置一个断点。然后快速查看两个字符串 –

0

据我所知,你不能同时读取和写入文件(文件锁定)。你可以做的是将适当的数据写入tim4.txt(如你的例子),当你完成时,删除tim3.txt并将tim4.txt重命名为tim3.txt。

编辑:误解你的问题。我以为你不能将你的修改写入同一个文件,但是你的文本甚至没有被过滤。你应该尝试Tilan的建议

+0

以及我已经看到很多人建议这种方式。我不知道我将如何去做这件事。 –

+0

这其实很简单。在使用语句之后(当所有IO读/写完成时)插入一个简单的try/catch块并调用File.Delete(file_to_delete)。然后,您需要将您的新文件(tim4)重命名为旧的(tim3)的名称。由于C#没有提供重命名功能,因此可以调用File.Move(old_file,new_file)。这是否清理了事情? –

+0

发现了一个完全按照我的意思发布代码的人:http://stackoverflow.com/a/668917/1222748 –

0

从你的意见我知道你正试图删除以 - 开头的行。如果是这样的话,你只需要更改从if条件:

  if (string.Compare(line, line_to_delete) == 0) 
       continue; 

到:

  if (line.Trim().IndexOf(line_to_delete) == 0) 
       continue;