Повторное использование сопоставленной буквы диска, но путь в диалоговом окне копирования / перемещения Windows всегда отображает путь первого сопоставления
Я написал программу на Delphi 10.2 Tokyo для архивирования домашних папок пользователей. Папки архивируются после удаления учетных записей пользователей из Active Directory. Я использую Windows IFileOperation для перемещения папок. Когда программа перебирает список пользователей, она отображает букву диска (одинаковую каждый раз) в домашнюю сетевую папку пользователя, а затем вызывает IFileOperation для ее перемещения. В первый раз путь, отображаемый в диалоговом окне "Перемещение Windows", правильно отображает букву диска и сопоставленный путь. После завершения перемещения диалоговое окно закрывается, цикл переходит к следующему пользователю. Буква диска отображается в домашнюю папку следующего пользователя, но на этот раз при появлении диалогового окна "Перемещение Windows" отображается путь от первого пользователя. Корректная папка перемещена в папку архива, но отображение некорректно. Это происходит для всех оставшихся предметов. Как будто первое отображение каким-то образом кэшируется при первом вызове IFileOperation, а затем все последующие вызовы используют кэшированное значение вместо запроса буквы диска для определения истинного сетевого пути.
Есть ли способ...
- принудительный запрос сопоставленной буквы диска, или
- очистить кеш, или
- что-то другое
... каждый раз, когда вызывается IFileOperation, чтобы в диалоге перемещения Windows отображался правильный путь?
При сопоставлении буквы диска с домашней папкой я попытался установить для параметра UpdateProfile значение False, но я получаю сообщение об ошибке "диск имеет запомненное соединение", поэтому необходимо установить значение "Истина" как при подключении, так и при отключении.
Псевдокод для иллюстрации повторяющегося сопоставления дисков:
mapDrive('t:','\\archiveServer\home')
for i := 0 to Length(UserList) - 1
begin
mapDrive('h:',UserList[i].homeDirectory) // e.g. \\server1\home\username, \\server2\home\username (each remote site has a user home share)
if not MoveDirIFileOperation('h:','t:\'+UserList[i].sAMAccountName) then DisplayErrorMessage
unmapDrive('h:')
end
unmapDrive('t:')
MoveDirIFileOperation Функция:
function MoveDirIFileOperation(const srcDir,dstDir: String): Boolean;
var
r: HRESULT;
fileOp: IFileOperation;
siSrcDir: IShellItem;
siDstDir: IShellItem;
begin
Result:=False;
r:=CoInitializeEx(nil,COINIT_APARTMENTTHREADED or COINIT_DISABLE_OLE1DDE);
if Succeeded(r) then
begin
try
r:=CoCreateInstance(CLSID_FileOperation, nil, CLSCTX_ALL, IFileOperation, fileOp);
if Succeeded(r) then
begin
r:=fileOp.SetOperationFlags(FOF_NOCONFIRMATION OR FOFX_NOMINIMIZEBOX);
if Succeeded(r) then
begin
try
r:=SHCreateItemFromParsingName(PChar(srcDir),nil,IShellItem,siSrcDir);
except
r:=-1;
end;
if Succeeded(r) then
begin
try
r:=SHCreateItemFromParsingName(PChar(dstDir),nil,IShellItem,siDstDir);
except
r:=-1;
end;
if Succeeded(r) then r:=fileOp.MoveItem(siSrcDir,siDstDir,nil,nil);
end;
if Succeeded(r) then r:=fileOp.PerformOperations;
Result:=Succeeded(r);
end;
end;
finally
CoUninitialize;
end;
end;
end;
Если вам нужна дополнительная информация, пожалуйста, дайте мне знать. Я предоставлю, что я могу.
1 ответ
В случае, если это помогает, с NET USE я прочитал, что есть недокументированный ключ /Y, чтобы освободить ресурсы при удалении подключенного диска. Пример: NET USE X: /DELETE /Y Непроверено, только к вашему сведению.