重复使用映射的驱动器号,但Windows复制/移动对话框中的路径始终显示第一个映射的路径

问题描述 投票:0回答:1

我在Delphi 10.2 Tokyo编写了一个程序来存档用户的主文件夹。从Active Directory中删除用户帐户后,将对文件夹进行存档。我正在使用Windows IFileOperation来执行文件夹移动。当程序遍历用户列表时,它会将驱动器号(每次都相同)映射到用户的网络主文件夹,然后调用IFileOperation来移动文件夹。第一次,Windows移动对话框中显示的路径正确显示驱动器号和映射路径。移动完成后,对话框关闭,循环移动到下一个用户。驱动器号映射到下一个用户的主文件夹,但这次出现Windows移动对话框时,它显示第一个用户的路径。正确的文件夹将移动到存档位置,但显示不正确。所有剩余项目都会发生这种情况就好像第一次映射在第一次调用IFileOperation时以某种方式缓存,然后所有后续调用都使用缓存值而不是查询真实网络路径的驱动器号。

有没有办法......

  1. 强制查询映射的驱动器号,或
  2. 刷新缓存,或
  3. 别的

...每次调用IFileOperation时,都会在Windows Move对话框中显示正确的路径?

在将驱动器号映射到主文件夹时,我尝试将UpdateProfile参数设置为False,但是我得到“驱动器有记忆连接”错误,因此必须在连接和断开连接中将其设置为True。

伪代码来说明重复的驱动器映射:

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;

如果需要更多信息,请告诉我。我会提供我能做的。

delphi drive-mapping
1个回答
0
投票

如果它有帮助,使用NET USE,我读过有一个未记录的/ Y开关来删除映射驱动器时释放资源。例如:NET USE X:/ DELETE / Y未经测试,只是一个FYI。

© www.soinside.com 2019 - 2024. All rights reserved.