2012-05-16 163 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;