Opening a file's Shadow Copy if the current copy is in use

我只是一个虾纸丫 提交于 2019-12-01 04:19:57

This question is quite old already, so my answer might not be of much use to you, but SO being a Q&A site maybe it still helps someone else.

I can't / don't want to put down the entire implementation, but the procedure is goes something like this:

  1. You create a Volume Shadow Copy via the Volume Shadow Service Provider for the drive where your file to be read is located(this is well documented on MSDN, also there is a sample client that creates these shadow copies and will most likely be sufficient for you)

  2. Either make a persistent one, or use the "callback" mechanism (calls your app)

  3. Open the desired file via UNC paths and CreateFile (the UNC looks something like this: \\?\GlobalRoot\Devices\HarddiskVolumeShadowCopyXZY\yourpath\yourfile.yourextension)

  4. Do whatever you want with the file

  5. If you made a persistent VSC you should use the sample client to delete it after you're done

more info here: http://technet.microsoft.com/en-us/library/cc785914%28WS.10%29.aspx and here: http://msdn.microsoft.com/en-us/library/bb968832%28VS.85%29.aspx

I cannot actually tell, but there is the following Channel 9 video.

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

There are some implementation details and a bit about the API structure. And I believe to remember that they mentioned how the shadow copies are mapped into the file system.

If you have control of the first process you can specify file handle share type

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);
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!