我正在尝试在服务器上备份文件,但其中一些文件正在使用中,无法打开。相反,如果当前副本正在使用中,我想打开他们的卷影副本。我怎样才能做到这一点?
作为参考,我使用的是 C# .net 3.5。
我正在尝试在服务器上备份文件,但其中一些文件正在使用中,无法打开。相反,如果当前副本正在使用中,我想打开他们的卷影副本。我怎样才能做到这一点?
作为参考,我使用的是 C# .net 3.5。
这个问题已经很老了,所以我的回答可能对你没有多大用处,但是作为一个问答网站,也许它仍然可以帮助其他人。
我不能/不想放下整个实现,但过程是这样的:
您通过卷影服务提供商为要读取的文件所在的驱动器创建卷影副本(这在 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“时间扭曲”:了解 Vista 的备份和还原技术
有一些实现细节和一些关于 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);