2013-03-01 49 views
1

我有一個程序,我可以在該程序中添加一個汽車啓動銷售清單,並指定它們是否用於慈善等。還有一個按鈕可生成汽車啓動銷售清單這是爲慈善機構和那些不是不同的文本文件。當我將慈善啓動銷售添加到應用程序並生成列表時,它將文件寫入文件。但是,當我再次加載應用程序並嘗試生成文件時,它會生成一個空白列表。 (我有在退出時保存應用程序數據並在啓動時重新加載數據的功能)。報告有時不寫入文件

我不知道爲什麼會發生這種情況?

下面是用於生成列表文件按鈕後面的代碼:

 List<CarBootSale> carbootsales = carBootSaleList.ReturnList(); 
     carbootsales.Sort(delegate(CarBootSale bs1, CarBootSale bs2) 
     { 
      return Comparer<string>.Default.Compare(bs1.ID, bs2.ID); 
     }); 
     textReportGenerator.GenerateCharityReport(carbootsales, AppData.CHARITY); 
     MessageBox.Show("All the Charity Car Boot Sales have been written to the report file: " + AppData.CHARITY); 

這裏在TextReportGenerator類的代碼生成報告:

 FileStream outFile; 
     StreamWriter writer; 

     //create the file and write to it 
     outFile = new FileStream(filePath, FileMode.Create, FileAccess.Write); 
     writer = new StreamWriter(outFile); 

     //For each object in the list, add it to the file 
     foreach (CarBootSale obj in CharityList) 
     { 
      if (obj.Charity == "true") 
      { 
       writer.WriteLine(obj.Display()); 
      } 
     } 
     //close the file which has been opened 
     writer.Close(); 
     outFile.Close(); 

回答

1

你的代碼主要是長相罰款(注:見下文),所以沒有整個代碼在本地運行,我不能給出具體的建議,除了使用using

考慮使用這樣的代碼:

using(FileStream outFile = new FileStream(filePath, FileMode.Create, FileAccess.Write)) 
    using(StreamWriter writer = new StreamWriter(outFile)) { 

     //For each object in the list, add it to the file 
     foreach (CarBootSale obj in CharityList) { 
      if (obj.Charity == "true") { 
       writer.WriteLine(obj.Display()); 
      } 
     } 

    } 

我的猜測是,有一個在你的Display方法的異常沒有被處理,所以你要.Close通話將永遠不會被製成,所以數據從來都不是從緩衝區刷新到磁盤。使用using塊保證無論發生什麼(異常或過早return),您的流的緩衝區都將寫入磁盤而不會丟失任何數據。

一件小事:爲什麼.Charity是一個字符串?爲什麼不是booleanenum屬性?

+0

您的代碼工作得很好,非常感謝您的幫助! :)我早些時候嘗試布爾值,但它拋出了很多錯誤,所以我將它改回字符串。 – Danny 2013-03-01 22:59:22