2015-05-31 35 views
0

我已經搜索了互聯網並查看了很多帖子,但沒有人幫助過我。所以我決定在這裏問自己的問題。在讀取/寫入操作期間無法訪問已關閉的文件 - C#

當我點擊窗體上的保存按鈕時,我正在將一些數據寫入二進制文件,並且從窗體打開文件時從文件中讀取數據。數據包括來自某些文本框和兩個列表的文本。我創建了具有下面的代碼保存方法:

BinaryWriter writer = new BinaryWriter(new FileStream(savedFileName, FileMode.Create, FileAccess.Write)); 
     writer.Write(Database.firstName); 
     writer.Write(Database.middleName); 
     writer.Write(Database.lastName); 
     writer.Close(); 

我要寫它具有以下代碼列表中的其他一般方法:

private void writeDGVrowListToBinaryFile(List<DGVrow> list, BinaryWriter R) 
     { 
      Nrows = list.Count; 
      R.Write(Nrows); 
      for (int i = 0; i < Nrows; i++) 
      { 
       DGVrow dgvr = list[i]; 
       R.Write(dgvr.Day); 
       R.Write(dgvr.FromTime); 
       R.Write(dgvr.ToTime); 
      } 
      R.Close(); 
     } 

因爲我有兩份清單,我添加了這些兩行的保存方法,所述writer.Close()行之前,改變所述第一碼本:

BinaryWriter writer = new BinaryWriter(new FileStream(savedFileName, FileMode.Create, FileAccess.Write)); 
writer.Write(Database.firstName); 
writer.Write(Database.middleName); 
writer.Write(Database.lastName); 
writeDGVrowListToBinaryFile(Database.officeHoursList, writer); 
writeDGVrowListToBinaryFile(Database.classScheduleList, writer); 
writer.CLose(); 

的問題是,當代碼到達R.Write(Nrows);它會拋出ObjectDisposedException並且表示它無法訪問一個已關閉的文件。什麼導致此時文件被關閉?我怎樣才能防止文件關閉?

閱讀時發生同樣的問題,因爲閱讀使用與書寫相同的模式。

+0

因此,你有一個例外,說'該文件已關閉',你甚至不打擾如果你關閉文件搜索? – Steve

+0

@Steve這是我問的問題,我無法理解是什麼導致文件被關閉。現在我已經明白了。 –

回答

1

這是什麼導致文件被關閉?

您致電R.Close()writeDGVrowListToBinaryFile。你不應該用這種方法關閉作者。您幾乎從不想關閉傳遞到方法中的文件句柄(或其他可任意使用的資源) - 通常您需要獲取句柄,使用它(可能將其傳遞給其他方法),然後關閉它,所有方法都是相同的。我也建議你使用using語句來確保文件即使拋出異常關閉:

using (var writer = new BinaryWriter(...)) 
{ 
    writer.Write(Database.firstName); 
    writer.Write(Database.middleName); 
    writer.Write(Database.lastName); 
    writeDGVrowListToBinaryFile(Database.officeHoursList, writer); 
    writeDGVrowListToBinaryFile(Database.classScheduleList, writer); 
} 

我還強烈建議您重新審視你的命名 - 無論您的參數( R是非常規沒有明顯的意義)和方法名(writeDGVrowListToBinaryFile是標新立異 - 如何只WriteRowList它採取了BinaryWriter,所以它應該是顯而易見的,它會寫吧..)

+0

非常感謝。它解決了我的問題。 –

1

刪除f ROM在writeDGVrowListToBinaryFile之內,導致文件提前關閉。

相關問題