Отваряне на Shadow Copy на файл, ако текущото копие се използва

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

За справка използвам C# .net 3.5.


person Malfist    schedule 18.03.2009    source източник


Отговори (3)


Този въпрос вече е доста стар, така че отговорът ми може да не е от голяма полза за вас, но тъй като е сайт за въпроси и отговори, може би все още ще помогне на някой друг.

Не мога/не искам да запиша цялата реализация, но процедурата е нещо подобно:

  1. Създавате Volume Shadow Copy чрез Volume Shadow Service Provider за устройството, където се намира вашият файл за четене (това е добре документирано в 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

person Tom    schedule 07.09.2010
comment
Проблемът е, че вградените инструменти за управление на файлове на .NET нямат достъп до \\?\GlobalRoot директиви. Всъщност трябва да се спуснете до нивото на winapi. Има библиотека, наречена AlphaFSS, която може, но има някои големи проблеми. Използвах го известно време, но се натъкнах на проблеми с размера на файла, изискваше и двата DWORD, за да представят неговия размер, AlphaFSS чете само по-ниския DWORD. - person Malfist; 08.09.2010
comment
Знам, че това е стара тема... но .Net 4.62 и по-нова версия поддържа префикса \\?\ - person egray; 17.10.2018

Всъщност не мога да кажа, но има следното видео на Channel 9.

Windows Vista " Time Warp“: Разбиране на технологиите за архивиране и възстановяване на Vista

Има някои подробности за изпълнението и малко за структурата на API. И вярвам, че си спомням, че те споменаха как сенчестите копия се картографират във файловата система.

person Daniel Brückner    schedule 18.03.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);
person Sergej Andrejev    schedule 18.03.2009
comment
Нямам контрол върху процеса на заключване на файла. - person Malfist; 19.03.2009