2016-12-07 4 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(); 
    } 
    } 
} 

私のプログラムのある時点で、ファイルは "破壊され"ます。これがファイルに書き込む権利を持つ唯一の方法ですので、私はこの方法が問題だと思います。

私は、Filestreamがフラッシュされて閉じられるとき、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 while load data(無料翻訳) –

関連する問題