Перемещение системного файла между дисками приводит к тому, что 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
каждой операции перемещения.