




Почти так же, как мой ответ на Другой вопрос:
Если вы используете Win32, официальный способ сделать это - пометить его для перемещения при перезагрузке и попросить пользователя перезагрузиться. Чтобы пометить файл, который нужно переместить при перезагрузке, используйте MoveFileEx с флагом MOVEFILE_DELAY_UNTIL_REBOOT.
Это та же функция, только на этот раз вы не передаете NULL в качестве места назначения.
Для этой цели можно использовать API VSS (служба теневого копирования томов, а не Visual SourceSafe). Несмотря на то, что это мощный, это не совсем простой в использовании API: Обзор обработки резервной копии в VSS должен дать вам представление о том, что задействовано.
Несмотря на то, что это относительно недавний API, поддержка .NET для VSS в значительной степени (и непростительно) отсутствует. Вы не можете вызвать большую часть API через Interop, а файловые функции Framework не будут работать с пространством имен ядра, которое VSS использует для предоставления файлов моментальных снимков. В качестве бонуса есть ужасающие проблемы с 32/64-разрядными версиями и XP-vs-Vista, что также делает развертывание захватывающим (ответственная команда в Microsoft должна действительно гордиться!)
В любом случае, проект AlphaVSS намеревается предоставить .NET полную функциональность VSS и выглядит очень многообещающим, хотя он все еще находится на стадии предварительной бета-версии. Однако это может помочь вам, и это с открытым исходным кодом (управляемый C++).
Хороший пример того, как что-то делать с помощью Win32, см. В разделе HoboCopy. Утилита довольно полезна сама по себе, а полный исходный код C++ также доступен в Страница проекта SourceForge.
В зависимости от того, что именно заблокировало ваш файл, вы можете либо выполнить System.IO.File.Copy (), либо создать System.IO.BinaryReader и System.IO.BinaryWriter и вручную создать копию файла, прочитав куски заблокированный файл и запись их в новый файл. Я видел ситуации, когда один метод был возможен, а другой - нет, в зависимости от того, почему файл был заблокирован.
Это ответ "все .NET".