Повторное использование сопоставленной буквы диска, но путь в диалоговом окне копирования / перемещения Windows всегда отображает путь первого сопоставления

Я написал программу на Delphi 10.2 Tokyo для архивирования домашних папок пользователей. Папки архивируются после удаления учетных записей пользователей из Active Directory. Я использую Windows IFileOperation для перемещения папок. Когда программа перебирает список пользователей, она отображает букву диска (одинаковую каждый раз) в домашнюю сетевую папку пользователя, а затем вызывает IFileOperation для ее перемещения. В первый раз путь, отображаемый в диалоговом окне "Перемещение Windows", правильно отображает букву диска и сопоставленный путь. После завершения перемещения диалоговое окно закрывается, цикл переходит к следующему пользователю. Буква диска отображается в домашнюю папку следующего пользователя, но на этот раз при появлении диалогового окна "Перемещение Windows" отображается путь от первого пользователя. Корректная папка перемещена в папку архива, но отображение некорректно. Это происходит для всех оставшихся предметов. Как будто первое отображение каким-то образом кэшируется при первом вызове IFileOperation, а затем все последующие вызовы используют кэшированное значение вместо запроса буквы диска для определения истинного сетевого пути.

Есть ли способ...

  1. принудительный запрос сопоставленной буквы диска, или
  2. очистить кеш, или
  3. что-то другое

... каждый раз, когда вызывается 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 Непроверено, только к вашему сведению.

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