Документация SHFileOperation()
говорит:
Возвращаемое значение
Тип: INT
Возвращает ноль в случае успеха; иначе нет. Приложения обычно должны просто проверять нуль или ненулевое значение.
Рекомендуется проверять значение члена fAnyOperationsAborted SHFILEOPSTRUCT. SHFileOperation может вернуть 0 для успеха, если пользователь отменяет операцию. Если вы не проверите fAnyOperationsAborted и возвращаемое значение, вы не можете знать, что функция выполнила всю заданную вами задачу, и вы можете перейти к неправильным предположениям.
Не используйте GetLastError с возвращаемыми значениями этой функции.
Для проверки ненулевых значений для целей устранения неполадок они в основном сопоставляются с данными, определенными в Winerror.h. Однако некоторые из его возможных возвращаемых значений основаны на кодах ошибок pre-Win32, которые в некоторых случаях перекрывают более поздние значения Winerror.h без соответствия их значения. Эти конкретные значения подробно описаны здесь, и для этих конкретных значений только эти значения должны приниматься по кодам Winerror.h.
В вашем случае 0x20
не один из кодов ошибок до Win32, поэтому он отображает до стандартного кода ошибки Win32, в частности ERROR_SHARING_VIOLATION
, который подходит для вашей ситуации, как один из файлов не может быть доступ.
Чтобы пропустить файл-нарушитель, включите флаг FOF_NOERRORUI
в поле SHFILEOPSTRUCT::fFlags
. Документация SHFILEOPSTRUCT
говорит только следующее о том, что флаг:
FOF_NOERRORUI
Не отображать диалоговое окно для пользователя, если происходит ошибка.
Однако документация имеет также сказать:
fAnyOperationsAborted
Тип: BOOL
Когда функция возвращается, этот элемент содержит значение TRUE, если какие-либо операции с файлами прервана, прежде чем они были завершены ; в противном случае FALSE.Операция может быть вручную отменена пользователем через UI или , она может быть автоматически отключена системой, если установлены флаги FOF_NOERRORUI или FOF_NOCONFIRMATION.
Документация IFileOperation
(которая заменяет SHFileOperation()
на Vista, и позже) имеет больше сказать о FOF_NOERRORUI
флага:
FOF_NOERRORUI (0x0400)
Не отображать сообщение пользователю если произошла ошибка. Если этот флаг установлен без FOFX_EARLYFAILURE, любая ошибка обрабатывается так, как если бы пользователь выбрал Ignore или Continue в диалоговом окне. Он останавливает текущее действие, устанавливает флаг, указывающий на то, что действие было прервано, и продолжит оставшуюся часть операции.
...
FOFX_EARLYFAILURE (0x00100000)
Если FOFX_EARLYFAILURE устанавливается вместе с FOF_NOERRORUI, весь набор операций останавливается при встрече с какой-либо ошибки в любой операции. Этот флаг действителен только тогда, когда установлен FOF_NOERRORUI.
Так, с FOF_NOERRORUI
включены, возвращаемым значением ERROR_SHARING_VIOLATION
, а также SHFILEOPSTRUCT::fAnyOperationsAborted
поля быть установлено в TRUE, будет вам сказать, что файл не удался получить доступ во время копирования, но не какого файл в частности. Это не означает, что вся задача SHFileOperation()
потерпела неудачу.
Только RTFM, вы пробовали FOF_NOERRORUI? –
@ ХансПасант да. Я использую 'FOF_SILENT | FOF_NOCONFIRMMKDIR | FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_NO_UI'. – deselect
Тогда, конечно, он отлично работает и скопировал файлы, которые он мог, и пропустил те, которые он не смог? Возвращаемое значение просто указывает, что не все файлы были скопированы, что обычно имеет значение. –