Опитвам се да архивирам файлове на сървър, но някои от тях се използват и не могат да бъдат отворени. Вместо това бих искал да отворя тяхното скрито копие, ако текущото копие се използва. Как мога да направя това?
За справка използвам C# .net 3.5.
Опитвам се да архивирам файлове на сървър, но някои от тях се използват и не могат да бъдат отворени. Вместо това бих искал да отворя тяхното скрито копие, ако текущото копие се използва. Как мога да направя това?
За справка използвам C# .net 3.5.
Този въпрос вече е доста стар, така че отговорът ми може да не е от голяма полза за вас, но тъй като е сайт за въпроси и отговори, може би все още ще помогне на някой друг.
Не мога/не искам да запиша цялата реализация, но процедурата е нещо подобно:
Създавате Volume Shadow Copy чрез Volume Shadow Service Provider за устройството, където се намира вашият файл за четене (това е добре документирано в MSDN, също така има примерен клиент, който създава тези скрити копия и най-вероятно ще бъде достатъчен за вас )
Или направете постоянен такъв, или използвайте механизма за „обратно извикване“ (извиква вашето приложение)
Отворете желания файл чрез UNC пътища и CreateFile (UNC изглежда по следния начин: \\?\GlobalRoot\Devices\HarddiskVolumeShadowCopyXZY\yourpath\yourfile.yourextension)
Правете каквото искате с файла
повече информация тук: http://technet.microsoft.com/en-us/library/cc785914%28WS.10%29.aspx и тук: http://msdn.microsoft.com/en-us/library/bb968832%28VS.85%29.aspx
Всъщност не мога да кажа, но има следното видео на Channel 9.
Windows Vista " Time Warp“: Разбиране на технологиите за архивиране и възстановяване на Vista
Има някои подробности за изпълнението и малко за структурата на 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);