2012-02-25 6 views
2

私は、起動時にファイルからリンクリストを読み込み、終了時にファイルに書き戻すアプリケーションを持っています。私は書き戻すときにファイルモードとしてtruncateを選択します。しかし、truncateはコンテンツ全体を最初にクリアするので、少し危険です。したがって何かがうまくいかない場合、私は古いものを取り戻すことができません。より良い選択肢はありますか?より安全に聞こえる「切り詰め」の代替手段はありますか?

1:アイテムの順序が変更される可能性があるため、リンクされたリストを使用します。したがって、後でtruncateを使用してファイル全体を更新します。それは今のSilverlightのために利用可能ではないですが、彼は最初、File.Replace()指摘したように


正しい答えの評判はハンスに行きます。

答えて

3

これは.NETフレームワークでよく説明されています。 File.Replace()メソッドを使用します。元のファイルの内容を別のファイルの内容にしっかりと置き換えて、ファイルシステムに問題があれば元のファイルをそのまま残します。 upvoted回答よりも優れたマウストラップですが、元のファイルに保留中の削除があると失敗します。

元のファイルをバックアップファイルとして保存するかどうかを制御できるオーバーロードがあります。この機能を使用してバックアップを作成させるのが最善の方法です。ファイルにロックが設定されているときに関数が成功する確率が最も高くなります。最も一般的な障害モードです。彼らはバックアップファイルにロックを維持するようになるでしょう。この方法は、元のドライブと同じドライブに中間ファイルを作成するときにもうまく機能するので、GetTempFileName()を避けたいと思うでしょう。ファイル名を生成する良い方法は、Guid.NewGuid()。ToString()です。

+0

申し訳ありませんが、バックアップを作成する必要があるかどうかわかりません。 –

+0

いいえ、バックアップファイルを作成しないでください。その名前を渡すだけで、典型的には "filename.ext.bak"です。 –

5

新しい一時ファイルに書き込みます。終了して結果に満足したら、古いファイルを削除し、新しい一時ファイルを元のファイルの場所に名前変更/コピーします。このように、何かが間違っていても、データを失うことはありません。

Hans Passantsの回答で指摘されているように、元のファイルを置き換える際に最大限の堅牢性を得るには、File.Replaceを使用する必要があります。

+0

一時ファイル用。失敗の唯一のウィンドウは、削除が完了しても名前の変更が完了しなかった場合です。アプリが起動して「メイン」ファイルが見つからない場合は、一時ファイルをチェックすることでこのような可能性の低いシナリオをカバーすることもできます。 –

+0

いいえ、削除共有のためにファイルを開いたときにデータが失われて失敗します。はるかに一般的な理由で、ウイルススキャナと検索インデクサがこれを行います。 –

2

堅牢性のための「最良」の選択肢は、次の操作を行うために、次のようになります。

  1. あなたはディスク
  2. に固執しているデータのための新しいファイルを作成して新しいファイルに出力データを書き込みます
  3. は、元のファイルを削除して、必要なデータ検証
  4. を実行し
  5. 新しいを移動
  6. 元のファイルの場所にファイル

あなたがtruncateを使用することを考えているステップ1

+0

ドリスの答えと同じ問題です。 –

2

に使用する一意の名前の一時ファイルを提供するためにSystem.IO.Path.GetTempFileNameを使用することができますので、私はあなたの入力データが常にあると仮定します改めて、そのため....

  1. ください... catch 'originalname_day_month_year.bak'
  2. 書き込みEX-novoの新しいデータを使用して、ファイルのようなものに元のファイルの名前を変更します。

このようにして、何かを緩める心配はありません。副作用として、以前のデータのバックアップコピーがあります。そのバックアップが不要な場合は、いつでもバックアップファイルを削除できます。

関連する問題