У меня есть рабочий код, использующий 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;
Delphi
иPascal
подходят, потому что проблема заключается в API-интерфейсе оболочки и может быть воспроизведена с тем же кодом на C ++ (как я уже упоминал в вопросе). ПометкаDelphi
может сузить аудиторию, исключив кого-то, знакомого с оболочкой, но добавившегоDelphi
и/илиPascal
в свой список игнорирования. - person Stan   schedule 23.10.2013