Копирование структуры каталогов с помощью SHFileOperation не удалось, если запрошен FOF_NOERRORUI - PullRequest
2 голосов
/ 07 февраля 2012

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

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

FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR | FOF_NOERRORUI

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

При этой комбинации флагов функция возвращает ошибку 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;

1 Ответ

4 голосов
/ 01 марта 2012

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

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

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

Обновление

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

...