Как скопировать файл или папку, которые программно заблокированы под Windows?

Каковы вызовы API для копирования файла, который в настоящий момент заблокирован. Я надеюсь, что сможет использовать .Net, но вызовы Win32 также будут прекрасными.

Пожалуйста, не стесняйтесь прослушивать те же функции в Unix или любой другой ОС.

Ответ 1

Для этой цели вы можете использовать API VSS (Служба теневого копирования томов, а не Visual SourceSafe). В то время как мощный, это не совсем простой в использовании API: Обзор обработки резервной копии под VSS должен дать вам представление о том, что.

Несмотря на то, что это сравнительно недавний API, поддержка VSS для VSS в значительной степени (и непростительно) отсутствует. Вы не можете вызывать большую часть API через Interop, а функции файла Framework не будут работать с пространством имен ядра, которое использует VSS для отображения файлов с моментальным снимком. В качестве бонуса есть ужасающие проблемы с 32/64-битными и XP-vs-Vista, что делает развертывание захватывающим (ответственная команда в Microsoft должна быть очень горд!)

В любом случае проект AlphaVSS намеревается принести полную функциональность VSS для .NET, и выглядит чрезвычайно перспективным, хотя он все еще находится в pre -бетальной стадии. Это может просто сделать трюк для вас, и это с открытым исходным кодом (Managed С++).

Для хорошего примера того, как делать вещи с помощью Win32, см. HoboCopy. Утилита весьма полезна сама по себе, и полный исходный код С++ доступен на странице SourceForge.

Ответ 2

Почти так же, как мой ответ на еще один вопрос:

Если вы находитесь на Win32, официальный способ сделать это - отметить, что он будет перенесен при перезагрузке и попросит пользователя перезагрузиться. Чтобы отметить файл, который нужно переместить при перезагрузке, используйте MoveFileEx с флагом MOVEFILE_DELAY_UNTIL_REBOOT.

Это ту же функцию, только на этот раз вы не передаете NULL в качестве адресата.

Ответ 3

В зависимости от того, что именно заблокировал ваш файл, вы можете либо сделать System.IO.File.Copy(), либо создать System.IO.BinaryReader и System.IO.BinaryWriter и вручную создать копию файла на чтение фрагментов заблокированного файла и запись их в новый файл. Я видел ситуации, когда один метод был возможен, а другой - нет, основываясь на том, почему файл был заблокирован.

Это ответ "все .NET".