2012-02-07 1 views
2

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

@TLama Я не думаю, что теги Delphi и Pascal подходят, потому что проблема кроется в API-интерфейсе оболочки и воспроизводится с тем же кодом в C++ (как я упоминал в вопросе). Пометка с помощью 'Delphi' может сузить аудиторию, исключив кого-то, знакомого с оболочкой, но добавив' Delphi' и/или 'Pascal' в свой список игнорирования. – Stan

ответ

4

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

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

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

Update

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

+0

Увы, вопросов нет в обычной (безвыходной) ситуации. Но если, например, один из файлов заблокирован с другим приложением, я получил сообщение об ошибке. Мне нужно подавить такой материал UI. Какую комбинацию флагов вы предлагаете использовать для моих требований? Что такое «безопасный вариант», упомянутый выше? – Stan