Значение HRESULT для пропуска файлов в IFileOperationProgressSink::метод PreCopyItem

#winapi #com

#winapi #com

Вопрос:

Я пытаюсь найти способ пропустить один или несколько файлов в IFileOperation::CopyItem методе, в котором целая папка копируется в новое место назначения.

Способ, которым я пытаюсь это сделать (план А), заключается в проверке файлов в FileOperationProgressSink::PreCopyItem методе и, если есть совпадение, возвращает значение, такое как COPYENGINE_E_USER_CANCELLED (0x80270000) . В противном случае верните S_OK . К сожалению, передача COPYENGINE_E_USER_CANCELLED приводит к отмене всей операции, а не только операции копирования текущего файла. Планом B было бы перечислить файлы, которые нужно скопировать, и протестировать файлы перед выполнением операции копирования, но это кажется громоздким.

Если план A кажется выполнимым, я был бы признателен, если бы вы могли поделиться HRESULT значением, которое позволило бы мне пропустить текущий файл. Тот факт, что функция копирования системы включает в себя возможность пропустить один или несколько файлов в случае столкновения, предполагает, что есть способ сделать это, но я не уверен.

Спасибо.

Комментарии:

1. В PreCopyItem документации четко указано: » Возвращает S_OK в случае успеха или значение ошибки в противном случае. В случае значения ошибки операция копирования и все последующие операции, ожидающие вызова IFileOperation, отменяются «. Это не оставляет места для пропуска только текущего файла. Я думаю, вам придется прибегнуть к вашему плану B, чтобы перебрать файлы заранее и решить, какие из них следует копировать, а какие нет.

2. Как сказал Реми, когда PreCopyItem функция возвращает ошибку, операция копирования будет отменена. Но если вы можете использовать IFileOperation :: SetOperationFlags функцию для настройки способа обработки файла, она может вызвать всплывающее диалоговое окно для пропуска, когда конфликтует функция одного или нескольких файлов.

3. Хотя это и не является частью официального контракта, вы можете попытаться вернуться S_FALSE и посмотреть, даст ли это желаемый эффект. S_FALSE это код успеха , обычно используемый для сообщения о том, что операция не была выполнена до завершения, но не из-за подлинной ошибки (например, IEnumVARIANT::Next ).

4. @RemyLebeau — Спасибо, что напомнили мне внимательно прочитать раздел возвращаемого значения документации. Как вы сказали, язык не оставляет места ни для чего, кроме успешного предварительного копирования или ошибки, которая влияет на все последующие операции. План B, похоже, единственный способ пропустить файлы. @Zhu Song — Спасибо за ваше предложение. Я знаю об этом IFileOperation::SetOperationFlags методе, но он не достигает того, чего я пытаюсь достичь. @IInspectable — Спасибо за предложение. Я попытался вернуться S_FALSE , но это не сработало. Похоже, что официальный контракт ограничен.