2014-10-16 69 views
2

我有一種讀取文本文件並將內容寫入數組列表的方法。數組列表是全局聲明的,沒有元素。這種方法完美。將數組列表寫入文本文件C#

private void LoadArrayList() 
{ 
    try 
    { 
     string actor; 
     TextReader tr; 
     tr = File.OpenText("actors.txt"); 

     while ((actor = tr.ReadLine()) != null) 
     { 
      ActorArrayList.Add(actor); 
     } 
     tr.Close(); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show("Error loading file!"); 
    } 
} 

我現在需要創建一個方法來讀取數組列表並將內容寫回到文本文件,替換文本文件中當前的內容。此方法導致一個空白的文本文件。任何想法是什麼我錯過/做錯了?

private void WriteArrayList() 
{ 
    TextWriter tw; 

    try 
    { 
     tw = File.CreateText("actors.txt"); 
     foreach (object o in ActorArrayList) 
      tw.WriteLine(o.ToString()); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show("Error saving file!"); 
    } 
} 

注:我知道人似乎並不喜歡數組列表或TextReader的或TextWriter的,但我做的課程涵蓋他們,所以我需要使用它們。

+0

您使用'ArrayList',通常僅使用爲了向後兼容任何特別的原因,通常優選的是使用'列表',在這種情況下,'列表'。 – 2014-10-16 10:20:12

+2

當您處理實現「IDisposable」的類時,您需要使用'使用'塊。如果您有支持它的Visual Studio,請啓用靜態代碼分析,以便在您忘記時發出警告。 – nvoigt 2014-10-16 10:20:36

+1

在方法的末尾使用'tw.Close();'。 – 2014-10-16 10:24:33

回答

2

你需要刷新或關閉您的作家:

private void WriteArrayList() 
{ 
    TextWriter tw = null; 

    try 
    { 
     tw = File.CreateText("actors.txt"); 
     foreach (object o in ActorArrayList) 
      tw.WriteLine(o.ToString()); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show("Error saving file!"); 
    } 
    finally 
    { 
     if(tw != null) 
      tw.Close(); 
    } 
} 
+0

應該是一個評論,而不是一個答案。 – Sander 2014-10-16 10:22:21

+0

@桑德:我編輯了我的答案,謝謝 – 2014-10-16 10:27:18

+2

現在,這是一個答案! :) – Sander 2014-10-16 12:53:15

2

您可以管理使用LINQ Cast()要做到這一點,在1個襯墊:

File.WriteAllLines(@"actors.txt", ActorArrayList.Cast<string>()); 

另外,下面的邏輯應該制定出

using (TextWriter writer = File.CreateText(@"actors.txt")) 
{ 
    foreach (string actor in ActorArrayList) 
    { 
     writer.WriteLine(actor); 
    } 
} 
0

您錯過了一次對tw.Flush()的調用,也是對tw.Close()的調用。不調用這些內容可能實際上不會寫入磁盤,而只會保留在內存中。 也在這種情況下,你應該使用前面提到的使用塊。

見下面的例子:

using (TextWriter tw = File.CreateText("actors.txt")) 
{ 
    try 
    { 
     foreach (object o in ActorArrayList) 
     tw.WriteLine(o.ToString()); 
     tw.Flush(); 
    } 
    catch (Exception ex) 
    { 
     MessageBoxShow("Error saving file!"); 
    } 
}