Перемещение системного файла между дисками приводит к тому, что fAnyOperationsAborted имеет значение TRUE при использовании Shell32DLL SHFileOperation/SHFILEOPSTRUCT

При использовании Shell32DLL SHFileOperation для файловых операций я столкнулся с проблемой, связанной с перемещением системных файлов на диски (например, c:\ to d:).

При перемещении пользователю будет предложено системное диалоговое окно с вопросом "Вы уверены, что хотите переместить этот системный файл? [Да, Пропустить, Отмена]"

Вот основная суть моей операции перемещения:

SHFILEOPSTRUCT struc = new SHFILEOPSTRUCT();
struc.pFrom = fromPtr;
struc.pTo = toPtr;
struc.wFunc = FO_MOVE;
struc.fFlags = 0; // no relevant flags for this
struc.hwnd = 0;
struc.lpszProgressTitle = string.Empty;
struc.fAnyOperationsAborted = false; // initialized to FALSE

int res = SHFileOperation(ref struc);

Операция возвращает 0x0, то есть успешно, но возвращенный fAnyOperationsAborted равен TRUE, даже если пользователь согласился переместить системный файл. Я ожидаю, что в этом случае операция вернет fAnyOperationsAborted=FALSE.

Проблема в том, что я не могу отличить пользователя, принимающего, пропускающего или отменяющего операцию, так как fAnyOperationsAborted имеет значение TRUE во всех трех случаях.

Как решить эту проблему?

MSDN для функции SHFileOperation: https://msdn.microsoft.com/en-us/library/windows/desktop/bb762164(v=vs.85).aspx

1 ответ

Сделать FOF_NOCONFIRMATION и / или FOF_NO_UI флаги помогают?

Если нет, вы можете использовать IFileOperation вместо этого (Vista+). Если вы добавите раковину, то IFileOperationProgressSink::PostMoveItem скажу вам HRESULT каждой операции перемещения.

Другие вопросы по тегам