如果当前副本正在使用,则打开文件的卷影副本

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

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

这个问题已经很老了,所以我的答案对你来说可能没什么用处,但是作为问答网站可能它仍然可以帮助别人。

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

  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

我实际上无法分辨,但有以下第9频道video。

Windows Vista“Time Warp”:了解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);