2010-10-09 51 views
1

嘿,這裏有點麻煩。當窗體退出時關閉流式讀取和流式編寫器

所以我有一個加載按鈕,加載文件,並保存按鈕保存文件。我也有一個關閉程序的退出按鈕。我需要幫助的是關閉程序時,我不會檢查是否有任何StreamReader或StreamWriter沒有關閉的東西。

繼承人是我到目前爲止有: 在頂部,我declear這些傢伙

bool isDirtyBoolean = false; 
    string moreData = ""; 

我Load按鈕看起來像這樣

private void loadToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     //begin in the project folder 
     openFileDialog1.InitialDirectory = Directory.GetCurrentDirectory(); 

     //display the file open dialog box 
     DialogResult responseDialogResult; 
     responseDialogResult = openFileDialog1.ShowDialog(); 

     if (responseDialogResult != DialogResult.Cancel) 
     { //check that user did not click the cancel button 
      //create a streamreader object for the selected file, 
      //read the file contents, 
      //and display each line of the file in the list box 

      StreamReader nameStreamReader = new StreamReader(openFileDialog1.FileName); 

      while (nameStreamReader.Peek() != -1) 
      { 
       freindsDataListBox.Items.Add(nameStreamReader.ReadLine()); 

      } 

      nameStreamReader.Close(); 
      isDirtyBoolean = true; 
     } 
    } 

我的保存按鈕看起來像這樣

 private void saveToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     //begin in the project folder 
     saveFileDialog1.InitialDirectory = Directory.GetCurrentDirectory(); 

     //display the file save dialog 
     DialogResult responseDialogResult; 
     responseDialogResult = saveFileDialog1.ShowDialog(); 

     if (responseDialogResult != DialogResult.Cancel) 
     { //check that user did not click the cancel button 
      //create a streamWriter object and 
      //then write out the list box items to the file 

      StreamWriter nameStreamWriter = new StreamWriter(saveFileDialog1.FileName); 

      int count = freindsDataListBox.Items.Count; 
      for (int i = 0; i < count; i++) 
      { 
       nameStreamWriter.WriteLine(freindsDataListBox.Items[i]); 
      } 

      nameStreamWriter.Close(); 
      isDirtyBoolean = true; 
      freindsDataListBox.Items.Clear(); 
     } 
    } 

我的退出按鈕看起來像這樣

 private void exitToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     if (isDirtyBoolean == false) 
      nameStreamReader.Close(); 
      nameStreamWriter.Close(); 

     this.Close(); 
    } 

我試圖做的是設置布爾isDirtyBoolean頂部,然後當流讀取器或寫入器關閉,將布爾值設置爲true,所以當我退出應用程序,如果它仍然設置爲false,無論如何它關閉它們。

但是這不工作,因爲isDirtyBoolean值是那些私人無效按鈕,我不能去他們。

回答

1

首先,你正在關閉你的流 - 雖然我會使用「使用」語句,以確保它們是封閉的,即使有異常。因此,在表單退出時無需關閉它們。

而且這是壞的編碼:

if (isDirtyBoolean == false) 
     nameStreamReader.Close(); 
     nameStreamWriter.Close(); 

你如果條件只適用於第一個聲明。如果之後需要放大括號。

+0

我的任務它說退出按鈕需要再次檢查流是否關閉或不 – 2010-10-09 22:06:27

1

使用「使用」或編寫自己的try/catch/finally塊並在finally中關閉流。

我假設這是家庭作業,所以如果你的任務需要你檢查流,你將不得不聲明你的流在他們當前聲明的方法之外。當你在方法中聲明某些東西時,它只有該方法的範圍,所以當前在你的退出按鈕處理程序中的代碼甚至不應該編譯。

如果您在退出按鈕處理程序中丟失了括號。

2

爲了更好地跟蹤事物的總體情況,請使用與您打開它們相同的方法關閉您的讀者和作者,而不是讓他們在應用程序期間生活。

如果您使用using,它們將自動處理(並關閉)。例子:

讀者:

using (StreamReader reader = new StreamReader(openFileDialog1.FileName)) { 

    // do your stuff... 

} // automatic close. 

你可以做同樣的刻錄機的實例。

或者,如果你正在閱讀和寫作的同時,你都可以打開並自動關閉無論是在年底,像這樣:

using (StreamReader reader = new StreamReader(openFileDialog1.FileName)) { 
    using (StreamWriter writer = new StreamWriter(path_to_other_file)) { 

     // now you're reading and writing 

     // DO YOUR STUFF 

    } // closes writer. 
} // closes reader. 

的原因,因爲它確實using作品是因爲IDisposable的由流讀取器和寫入器類實現的接口;實際上任何實現這個接口的類都是使用using聲明的候選者。


而且記得要留意的注意事項MSDN文檔中像這樣:

StreamWriter.Dispose always closes stream

StreamWriter.Dispose始終關閉 流處置一個StreamWriter關閉 底層即使您使用的是 構造函數,您在其中明確指定了 提供流。有時你想 保持流打開,但這個 類目前沒有提供一個 機制來做到這一點,除非不呼籲 調用Dispose,但一定要調用 Flush代替。

相關問題