Не удалось скопировать структуру каталогов с помощью SHFileOperation, если запрашивается FOF_NOERRORUI.

У меня есть рабочий код, использующий SHFileOperation для копирования одного каталога в другой. В данном случае это код Pascal, но я также использовал ту же функцию в C++, и проблема, похоже, связана с ядром Windows, а не с конкретным языком программирования.

Согласно MSDN, я хочу указать следующую комбинацию флагов:

FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR | FOF_NOERRORUI

То есть мне не нужен индикатор выполнения, я подавляю все возможные вопросы о файлах и каталогах подразумеваемыми ответами «да», и я не хочу никаких сообщений об ошибках в графическом интерфейсе (диалоговые окна).

При таком сочетании флагов функция возвращает ошибку 0x4C7 (отменено пользователем, что не соответствует действительности). Если я удалю FOF_NOERRORUI, он будет работать нормально с теми же входными параметрами и состоянием файловой системы.

К сожалению, мне также нужно подавить сообщения об ошибках, и требуется флаг FOF_NOERRORUI.

Кто-нибудь знает, как эту комбинацию флагов (и, возможно, другие предварительные условия) следует настроить для удовлетворения моих потребностей?

Вот исходный код для тех, кто может подумать, что там есть ошибки:

function CopyDirectory(WindowHandle: HWND; FilenameFrom: string; FilenameTo: string): Boolean;
var
  SH: TSHFILEOPSTRUCT;
begin
  FillChar(SH, SizeOf(SH), 0);
  with SH do
  begin
    Wnd := WindowHandle;
    wFunc := FO_COPY;
    pFrom := PChar(FilenameFrom + #0);
    pTo := PChar(FilenameTo + #0);
    fFlags := FOF_NOCONFIRMMKDIR or FOF_NOCONFIRMATION or FOF_SILENT or FOF_NOERRORUI;
  end;
  Result := SHFileOperation(SH) = 0;
  Result := Result and (not SH.fAnyOperationsAborted);
end;

person Stan    schedule 07.02.2012    source источник
comment
@TLama, я не думаю, что теги Delphi и Pascal подходят, потому что проблема заключается в API-интерфейсе оболочки и может быть воспроизведена с тем же кодом на C ++ (как я уже упоминал в вопросе). Пометка Delphi может сузить аудиторию, исключив кого-то, знакомого с оболочкой, но добавившего Delphi и/или Pascal в свой список игнорирования.   -  person Stan    schedule 23.10.2013


Ответы (1)


0x4C7 на самом деле:

"Операция была отменена пользователем или отменена автоматически, если в SHFileOperation были переданы соответствующие флаги".

Если вы отключите все флаги и позволите операции работать, какие вопросы вам будут задавать? Я предполагаю, что на один из этих вопросов ответили «Нет», потому что безопасный вариант — сделать это.

Обновить

Думали ли вы об использовании функции CopyFile() API? Не требуется подавление пользовательского интерфейса. Документация находится здесь .

person Nat    schedule 01.03.2012
comment
Увы, в нормальной (бесфлаговой) ситуации вопросов нет. Но если, например, один из файлов заблокирован другим приложением, я получаю сообщение об ошибке. Мне нужно подавить такие вещи пользовательского интерфейса. Какую комбинацию флагов вы предлагаете использовать для моих требований? Какой безопасный вариант вы упомянули выше? - person Stan; 13.03.2012