C# 打开文件';s卷影副本(如果当前副本正在使用)

C# 打开文件';s卷影副本(如果当前副本正在使用),c#,.net-3.5,shadow-copy,C#,.net 3.5,Shadow Copy,我正在尝试备份服务器上的文件,但其中一些文件正在使用中,无法打开。相反,如果当前副本正在使用,我希望打开它们的卷影副本。我该怎么做 作为参考,我使用的是C#.net 3.5。实际上我说不出来,但下面是第9频道的视频 这里有一些实现细节和一些关于API结构的信息。我相信您还记得,他们提到了卷影副本是如何映射到文件系统的。如果您可以控制第一个进程,则可以指定文件句柄共享类型 string contents1; string contents2; using (FileStream fs1 = ne

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


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

实际上我说不出来,但下面是第9频道的视频


这里有一些实现细节和一些关于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);

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

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

  • 您可以通过卷影服务提供商为要读取的文件所在的驱动器创建卷影副本(这在MSDN上有很好的文档记录,还有一个示例客户端可以创建这些卷影副本,很可能就足够了)

  • 要么做一个持久的,要么使用“回调”机制(调用你的应用程序)

  • 通过UNC路径和CreateFile打开所需的文件(UNC看起来像这样: \\?\GlobalRoot\Devices\HardDiskVolumeShadowcopyxy\yourpath\yourfile.yourextension)

  • 你想怎么处理这个文件都行

  • 如果您创建了一个持久的VSC,那么您应该在完成后使用示例客户机将其删除
  • 更多信息请点击此处:
    这里:

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