7

わかりました、説明します。私は、いつでも電源障害が発生する可能性のあるシステムを開発しています。私がテストしているポイントの 1 つは、StreamWriter を使用してファイルを書き出した直後です。以下のコード:

// Write the updated file back out to the Shell directory.
using (StreamWriter shellConfigWriter =
        new StreamWriter(@"D:\xxx\Shell\Config\Game.cfg.bak"))
{
    for (int i = 0; i < configContents.Count; i++)
    {
        shellConfigWriter.WriteLine(configContents[i]);
    }
    shellConfigWriter.Close();
}

FileInfo gameCfgBackup = new FileInfo(@"D:\xxx\Shell\Config\Game.cfg.bak");
gameCfgBackup.CopyTo(@"D:\xxx\Shell\Config\Game.cfg", true);

shellConfigWriter(List文字列の a) の内容を一時的な保存場所として使用されるファイルに書き込み、それを元のファイルにコピーします。このコードの実行が終了すると、電源が失われ、バックアップを再開すると、ファイルGame.cfgは存在し、正しいサイズですが、完全に空白になります。最初は、これはハード ドライブで書き込みキャッシュが有効になっているためだと思っていましたが、オフにしても発生します (頻度は低くなりますが)。

どんなアイデアでも大歓迎です!

更新:.Close()わかりました。ステートメントを削除し、.Flush()すべての書き込み操作の後に呼び出した後でも、ファイルは空白になります。さらに一歩進んで、新しいファイルを作成する前に元のファイルのバックアップを最初に作成し、完全性チェックを行うのに十分なバックアップを作成することもできますが、根本的な問題の解決には役立たないと思います (ファイルに書き込み、フラッシュして閉じるように指示すると...そうではありません!)。

4

3 に答える 3

14

オブジェクトのコンストラクターのFileOptionsパラメーターを使用して、OS が出力をバッファリングしないようにします。FileStream

    using (Stream fs = new FileStream(@"D:\xxx\Shell\Config\Game.cfg.bak", FileMode.Create, FileAccess.Write, FileShare.None, 0x1000, FileOptions.WriteThrough))
    using (StreamWriter shellConfigWriter = new StreamWriter(fs))
    {
        for (int i = 0; i < configContents.Count; i++)
        {
            shellConfigWriter.WriteLine(configContents[i]);
        }
        shellConfigWriter.Flush();
        shellConfigWriter.BaseStream.Flush();
    }
于 2009-09-15T15:14:26.743 に答える
7

まず、shellConfigWriter.Close()そこに電話する必要はありません。usingステートメントはそれを処理します。停電を防ぐために代わりにやりたいことは callshellConfigWriter.Flush()です。


更新
他に考慮すべきことは、電源障害が実際にいつでも発生する可能性がある場合、書き込みの途中で発生する可能性があるため、一部のバイトのみがファイルに書き込まれる可能性があるということです。それを止める方法は本当にありません。

これらのシナリオから保護するための一般的な手順は、状態/条件フラグ ファイルを使用することです。ファイル システム上に特定の名前の 0 バイト ファイルが存在するかどうかを使用して、再開時にどこから取得するかをプログラムに指示します。次に、特定の状態に到達し、前の状態を完了したことを 確認するまで、特定の状態をトリガーするファイルを作成または破棄しません。

ここでの欠点は、ときどき多くの作業を放棄することを意味する可能性があることです。しかし、利点は、コードの機能部分が通常のように見えることを意味することです。システムを十分に堅牢にするために行う追加作業はほとんどありません。

于 2009-09-15T13:51:23.637 に答える