2014-04-09 94 views
0

我正在爲Windows 8桌面構建應用程序,我正在閱讀文本文件,並且想要更改一個特定行,但不知道如何如此,因此我擁有的是文本文件說用c刪除文本文件中的特定行#

username|false 
username|false 
username|false 

而我想要刪除中間的一行時,這是我到目前爲止;

StorageFolder folder = ApplicationData.Current.LocalFolder; 
StorageFile storageFile = await folder.GetFileAsync("students.txt"); 
var text = await Windows.Storage.FileIO.ReadLinesAsync(storageFile); 
var list_false = ""; 

foreach (var line in text) 
{ 
    string name = "" + line.Split('|')[0]; 
    string testTaken = "" + line.Split('|')[1]; 
    if (your_name.Text == name) 
    { 
     if (testTaken == "false") { 
      pageTitle.Text = name; 
      enter_name_grid.Opacity = 0; 
      questions_grid.Opacity = 1; 
      var md = new MessageDialog("Enjoy the test"); 
      await md.ShowAsync(); 
     } 
     else 
     { 
      the_name.Text = "You have already taken the test"; 
      var md1 = new MessageDialog("You have already taken the test"); 
      await md1.ShowAsync(); 
     } 
     return; 
    } 
    else 
    { 
     list_false = "You're not on the list"; 
    } 
} 
if (list_false == "You're not on the list") { 
    var md2 = new MessageDialog("You're not on the list"); 
    await md2.ShowAsync(); 
} 

請幫助,它完美地讀取名稱,並允許他們接受測試,我只是需要它來刪除正確的行。提前致謝!!

+0

你是什麼意思「去掉中間線有事時」? – Tarec

+0

@Tarec嗯,當他們輸入他們的名字時,如果有匹配,那麼我想要刪除與他們名字相對應的行 – user3263978

回答

1

要考慮的重要事項是您正在修改文件。所以無論你選擇改變,你都需要把它寫回文件。

在你的情況下,你選擇將整個文件讀入內存,這實際上對你有利,像這樣的東西,因爲你可以刪除任何不需要的行並寫回文件。但是,使用foreach循環遍歷列表時,無法刪除項目。

從正在循環的數組中刪除項目的最佳做法是使用for循環和相反的循環。這也使得,如果我們有一個List<string>工作更容易去除的東西,比如這樣:

var list = new List<string>(text); 
for(int i = text.Length - 1; i >=0; i--) 
{ 
    string line = text[i]; 
    //rest of code 
} 
text = list.ToArray(); 

你的任務的下一部分是刪除線。您可以在else聲明中這樣做,因爲這是處理已經參加測試的用戶的部分。例如:

the_name.Text = "You have already taken the test"; 
list.RemoveAt(i); 

最後,你的循環之後,你需要寫整個事情迴文件:

await Windows.Storage.FileIO.WriteLinesAsync(storageFile, text); 
1

閱讀文件時,可以將內容存儲在列表中。當您的「事情發生」時,您可以刪除相應索引處的內容,並將列表保存(覆蓋)到文件中。

相關問題