2016-12-07 69 views
1

我將我的類的列表保存到二進制文件中,並使用FileStream和BinaryFormatter。BinaryFormatter.Serialize()在FileStream.Flush()和FileStream.Close()之前完成嗎?

private void SaveCustomers() 
{ 
    FileStream fs = null; 

    try 
    { 
    fs = new FileStream(Application.StartupPath + dataPath + @"\" + customersFilename, FileMode.Create, FileAccess.Write); 
    BinaryFormatter bf = new BinaryFormatter(); 
    bf.Serialize(fs, customers); 

    } 
    catch (Exception ex) 
    { 
    MessageBox.Show(ex.Message, "Fehler beim speichern der Besucherdaten", MessageBoxButtons.OK, MessageBoxIcon.Error); 
    } 
    finally 
    { 
    if (fs != null) 
    { 
     fs.Flush(); 
     fs.Close(); 
    } 
    } 
} 

在我的程序中的某個位置,文件被「銷燬」。由於這是唯一有權在文件中寫入的方法,所以我認爲這種方法是個問題。

我的假設是,當文件流被刷新並關閉時,BinaryFormatter沒有完成。

它最近才發生,因爲該文件開始時大約8 MB,它的工作完美無缺。

我對我的假設是否正確?或者它完全不同。

private void LoadCustomers() 
{ 
    FileStream fs = null; 

    try 
    { 
    fs = new FileStream(Application.StartupPath + dataPath + @"\" + customersFilename, FileMode.OpenOrCreate, FileAccess.Read); 
    BinaryFormatter bf = new BinaryFormatter(); 
    customers = (List<Customer>)bf.Deserialize(fs); 

    if (customers == null) customers = new List<Customer>(); 
    } 
    catch (Exception ex) 
    { 
    MessageBox.Show(ex.Message, "Fehler beim laden der Besucherdaten", MessageBoxButtons.OK, MessageBoxIcon.Error); 
    } 
    finally 
    { 
    if (fs != null) 
    { 
     fs.Flush(); 
     fs.Close(); 
    } 
    } 
} 

最後的代碼是我的讀者。

+1

無論是在你的'finally'塊中的任何內容都會在'try'和'catch'內的所有內容之後執行**。因此'終於'..它發生**最後**。 – ThePerplexedOne

+0

我同意@ThePerplexedOne - 只要你不序列化asyncron數據將被寫入你的文件。但是,你的意思是:「文件被破壞」?錯誤的數據?文件已刪除?有些不同?我的意思是FileMode.Create會創建或覆蓋你的文件,如果我是對的,...如果這是一種日誌文件,我想這不是你想要做的...如果你想追加使用'FileMode.Append '或'FileMode.OpenOrCreate' – TripleEEE

+0

嘗試在寫入之前刪除文件。我遇到了一個問題,我用'FileMode.Create'寫入了一個文件,並且在導致文件保存無效數據之前沒有正確截斷。在寫之前刪除修復它。 – Mats391

回答

0

您使用FileMode.Create這會導致您的程序覆蓋已存在的文件。 (我想這是你所說的「文件被破壞」的意思

你更應該使用FileMode.OpenOrCreate如果要在日誌文件中增加新的生產線,就像...

參見:MSDN創建:

指定操作系統應該創建一個新文件,如果文件已經存在,它將被覆蓋,這需要FileIOPermissionAccess.Write權限FileMode.Create相當於請求如果文件不存在,請使用CreateNew;否則,使用Truncate。如果文件已經存在,但是是隱藏文件,則爲UnauthorizedAccessException拋出異常。

+0

我擁有列表中需要的所有信息,並且需要所有信息都在文件中。如果我使用openorcreate它檢查什麼改變? –

+0

如果您使用'OpenOrCreate',它會去並將數據追加到您的FileStream相關文件。你想覆蓋你的舊信息?如果是這樣,那麼'Create'是正確的,就像你使用過的那樣。所以當你寫文件的時候寫得更大,那麼8MB的文件就像8Kb一樣寫?發生這種情況時,消息箱中是否顯示錯誤? – TripleEEE

+0

如果我嘗試稍後在另一個點上加載文件,則會發生錯誤。當我嘗試安全時,沒有異常拋出。 閱讀時的錯誤是這樣的:加載數據時的streamoverflow(免費翻譯) –

相關問題