【问题标题】:Opening a file's Shadow Copy if the current copy is in use如果当前副本正在使用中,则打开文件的卷影副本
【发布时间】:2009-03-18 20:43:39
【问题描述】:

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

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

【问题讨论】:

    标签: c# .net-3.5 shadow-copy


    【解决方案1】:

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

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

    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

    【讨论】:

    • 问题是 .NET 的内置文件管理工具无法访问 \\?\GlobalRoot 指令。您实际上必须下降到 winapi 级别。有一个名为 AlphaFSS 的库可以,但它有一些主要问题。我用了一段时间,但遇到了文件大小问题,需要两个 DWORD 来表示它的大小,AlphaFSS 只读取较低的 DWORD。
    • 我知道这是一个旧线程...但是 .Net 4.62 及更高版本确实支持 \\?\ 前缀
    【解决方案2】:

    我实际上无法确定,但有以下 9 频道的视频。

    Windows Vista "Time Warp": Understanding Vista's Backup and Restore Technologies

    有一些实现细节和一些关于 API 结构的信息。我相信记得他们提到过卷影副本是如何映射到文件系统中的。

    【讨论】:

      【解决方案3】:

      如果您可以控制第一个进程,则可以指定文件句柄共享类型

      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);
      

      【讨论】:

      • 我无法控制锁定文件的进程。
      猜你喜欢
      • 1970-01-01
      • 2016-02-21
      • 1970-01-01
      • 2015-09-05
      • 2013-07-10
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      • 2015-03-09
      相关资源
      最近更新 更多