У меня есть рабочий код, использующий SHFileOperation для копирования одного каталога в другой. В этом случае это код Pascal, но я также использовал ту же функцию в C++, и проблема, похоже, связана с ядром Windows, а не с конкретным языком программирования.Копирование структуры каталогов с SHFileOperation не удалось, если запрошен FOF_NOERRORUI
Согласно 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;
@TLama Я не думаю, что теги Delphi и Pascal подходят, потому что проблема кроется в API-интерфейсе оболочки и воспроизводится с тем же кодом в C++ (как я упоминал в вопросе). Пометка с помощью 'Delphi' может сузить аудиторию, исключив кого-то, знакомого с оболочкой, но добавив' Delphi' и/или 'Pascal' в свой список игнорирования. – Stan