Windows 8 で新しく導入されたファイル履歴に似た、小さな特殊なバックアップ アプリを作成することを考えていました。基本的な考え方は、N 時間ごとにいくつかのディレクトリをスキャンして変更されたファイルを探し、それらを別のボリュームにコピーすることです。問題は、バックアップ中に他のアプリがこれらのファイルへのアクセスを要求し、アクセスが拒否され、あらゆる種類の厄介な問題が発生する可能性があることです.
私が知る限り、その問題にはいくつかのアプローチがあります。
1) ボリューム シャドウ コピー サービスの使用
私の観点からは、このことの将来は不確実であり、重い IO 負荷の間のオーバーヘッドがシステムを不自由にする可能性があります。
2) ファイルを開くときに共有モードを使用する
このようなものはほとんど動作します...
using (var stream = new FileStream("test.txt", FileMode.Open, FileAccess.Read,
FileShare.Delete | FileShare.ReadWrite | FileShare.Read | FileShare.Write))
{
[Copy data]
}
... 他のプロセスが FileShare.Read なしで同じファイルへのアクセスを要求するまで、その時点で IOException がスローされます。
3)他の (書き込み?) 要求によって「壊れる」可能性がある日和見ロックの使用。
FileIO.ReadTextAsync のこの動作は、私が望んでいるものとまったく同じように見えますが、実装固有のようにも見え、将来変更される可能性があります。C#またはC++を介してローカルでファイルを明示的にoplockする方法を誰かが知っていますか?
そのような「丁寧な」読み取りを提供する File.TryReadBytes のような単純な C# メソッドがあるのではないでしょうか? Windows 7 以降で動作するソリューションに興味があります。