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

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

Не стесняйтесь сообщать о тех же функциях в Unix или любой другой ОС.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
12
0
3 802
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Если вы используете 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".

Другие вопросы по теме