【发布时间】:2009-03-18 20:43:39
【问题描述】:
我正在尝试备份服务器上的文件,但其中一些文件正在使用中,无法打开。相反,如果当前副本正在使用中,我想打开他们的卷影副本。我该怎么做?
作为参考,我使用的是 C# .net 3.5。
【问题讨论】:
标签: c# .net-3.5 shadow-copy
我正在尝试备份服务器上的文件,但其中一些文件正在使用中,无法打开。相反,如果当前副本正在使用中,我想打开他们的卷影副本。我该怎么做?
作为参考,我使用的是 C# .net 3.5。
【问题讨论】:
标签: c# .net-3.5 shadow-copy
这个问题已经很老了,所以我的回答可能对你没有多大用处,但是作为一个问答网站,也许它仍然可以帮助其他人。
我不能/不想放下整个实现,但过程是这样的:
您通过卷影服务提供商为要读取的文件所在的驱动器创建卷影副本(这在 MSDN 上有详细记录,还有一个示例客户端可以创建这些卷影副本并将很可能对你来说就足够了)
要么做一个持久化的,要么使用“回调”机制(调用你的应用)
通过 UNC 路径和 CreateFile 打开所需的文件(UNC 看起来像这样: \\?\GlobalRoot\Devices\HarddiskVolumeShadowCopyXZY\yourpath\yourfile.yourextension)
对文件做任何你想做的事情
更多信息在这里:http://technet.microsoft.com/en-us/library/cc785914%28WS.10%29.aspx 在这里:http://msdn.microsoft.com/en-us/library/bb968832%28VS.85%29.aspx
【讨论】:
我实际上无法确定,但有以下 9 频道的视频。
Windows Vista "Time Warp": Understanding Vista's Backup and Restore Technologies
有一些实现细节和一些关于 API 结构的信息。我相信记得他们提到过卷影副本是如何映射到文件系统中的。
【讨论】:
如果您可以控制第一个进程,则可以指定文件句柄共享类型
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);
【讨论】: