Как мне скопировать файл или папку, которые заблокированы в Windows программно? - PullRequest
12 голосов
/ 03 ноября 2008

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

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

Ответы [ 3 ]

16 голосов
/ 03 ноября 2008

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

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

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

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

5 голосов
/ 03 ноября 2008

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

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

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

4 голосов
/ 03 ноября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...