У меня есть рабочий код, использующий 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;