Открытие теневой копии файла, если текущая копия используется - PullRequest
7 голосов
/ 18 марта 2009

Я пытаюсь сделать резервную копию файлов на сервере, но некоторые из них используются и не могут быть открыты. Вместо этого я хотел бы открыть их теневую копию, если текущая копия используется. Как я могу это сделать?

Для справки я использую C # .net 3.5.

Ответы [ 3 ]

9 голосов
/ 07 сентября 2010

Этот вопрос уже довольно старый, поэтому мой ответ может быть не очень полезным для вас, но ТАК, что он является сайтом вопросов и ответов, может быть, он все еще помогает кому-то еще.

Я не могу / не хочу откладывать всю реализацию, но процедура выглядит примерно так:

  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

2 голосов
/ 19 марта 2009

Если у вас есть контроль над первым процессом, вы можете указать тип общего дескриптора файла

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);
2 голосов
/ 19 марта 2009

На самом деле я не могу сказать, но есть следующее видео на канале 9.

«Деформация времени» в Windows Vista: общие сведения о технологиях резервного копирования и восстановления Vista

Есть некоторые детали реализации и немного о структуре API. И я помню, что они упомянули, как теневые копии отображаются в файловой системе.

...