7

我正在尝试在服务器上备份文件,但其中一些文件正在使用中,无法打开。相反,如果当前副本正在使用中,我想打开他们的卷影副本。我怎样才能做到这一点?

作为参考,我使用的是 C# .net 3.5。

4

3 回答 3

9

这个问题已经很老了,所以我的回答可能对你没有多大用处,但是作为一个问答网站,也许它仍然可以帮助其他人。

我不能/不想放下整个实现,但过程是这样的:

  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 回答