7

サーバー上のファイルをバックアップしようとしていますが、一部のファイルは使用中で開くことができません。代わりに、現在のコピーが使用されている場合は、シャドウ コピーを開きたいと思います。これどうやってするの?

参考までに、C# .net 3.5 を使用しています。

4

3 に答える 3

9

この質問はすでにかなり古いので、私の答えはあまり役に立たないかもしれませんが、Q&A サイトであるため、他の人にとってはまだ役立つかもしれません。

実装全体を下に置くことはできません/したくありませんが、手順は次のようになります。

  1. ボリューム シャドウ サービス プロバイダーを介して、読み取るファイルが配置されているドライブにボリューム シャドウ コピーを作成します (これは MSDN で詳しく説明されています。また、これらのシャドウ コピーを作成するサンプル クライアントもあり、ほとんどの場合はこれで十分です。 )

  2. 永続的なものを作成するか、「コールバック」メカニズムを使用します (アプリを呼び出します)。

  3. UNC パスと CreateFile を介して目的のファイルを開きます (UNC は次のようになります: \\?\GlobalRoot\Devices\HarddiskVolumeShadowCopyXZY\yourpath\yourfile.yourextension)

  4. ファイルでやりたいことを何でもする

  5. 永続的な VSC を作成した場合は、完了後にサンプル クライアントを使用して削除する必要があります。

詳細はこちら: http://technet.microsoft.com/en-us/library/cc785914%28WS.10%29.aspx およびこちら: http://msdn.microsoft.com/en-us/library/bb968832% 28VS.85%29.aspx

于 2010-09-07T13:55:01.417 に答える
2

実際にはわかりませんが、次のチャンネル9のビデオがあります。

Windows Vistaの「タイムワープ」:Vistaのバックアップおよび復元テクノロジを理解する

いくつかの実装の詳細とAPI構造について少しあります。そして、シャドウコピーがファイルシステムにどのようにマッピングされるかについて言及したことを覚えていると思います。

于 2009-03-18T21:03:45.877 に答える
2

最初のプロセスを制御できる場合は、ファイルハンドル共有タイプを指定できます

string contents1;
string contents2;
using (FileStream fs1 = new FileStream("test.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
    using (var tr1 = new StreamReader(fs1))
    {
        using (FileStream fs2 = new FileStream("test.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
        {
            using (var tr2 = new StreamReader(fs2))
            {
                contents2 = tr2.ReadToEnd();
                contents1 = tr1.ReadToEnd();
            }
        }
    }
}

Console.WriteLine(contents1);
Console.WriteLine(contents2);
于 2009-03-18T21:05:38.527 に答える