从升级过程转移回收箱

时间:2013-11-12 15:11:59

标签: delphi winapi uac recycle-bin

我正在使用带有FO_DELETE参数的SHFileOperationW函数将文件移动到回收站(如果未禁用回收站)。

问题是当我以非管理员用户身份登录并以管理员身份运行我的应用程序时。文件将移至管理员回收站。

是否可以将文件移动到当前记录的非管理员用户的回收站?

我的想法是运行单独的非升级过程并将其从那里移动到回收站。但我不确定是否存在更好的解决方案。我试图在互联网上找到答案,但没有成功。

2 个答案:

答案 0 :(得分:0)

我建议使用以下例程 - 在Delphi XE 10上测试。

function File2Trash(const FileName: string): boolean;
var
    fos: TSHFileOpStruct;
begin
      FillChar(fos, SizeOf(fos), 0);
      with fos do
      begin
        wFunc  := FO_DELETE;
        pFrom  := PChar(ExpandFileName(FileName)+#0#0);
        fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION or FOF_SILENT or FOF_NOERRORUI;
      end;
      Result := (0 = ShFileOperation(fos));
end;

一些细节很重要:

  • 不应使用相对路径,应将现有路径扩展为 满一;
  • 将#0#0添加到文件名的末尾是必须的;
  • 要保持此操作无声,我建议再使用一个标志 FOF_NOERRORUI。

答案 1 :(得分:-1)

当我需要使用此例程时,我使用了以下命令。 我希望它很有用。

  
    

使用Delphi 2010和Windows 8进行测试。

  
procedure TForm2.Button1Click(Sender: TObject);
var
  vMsg : string;
begin
  // If want permanently delete
  //deletefile(edit1.text);

  SendFileToTrash(edit1.Text, vMsg);

  if (vMsg = '') then
  begin
    ShowMessage('File sent to the trash.');
  end else begin
    ShowMessage(vMsg);
  end;

end;


procedure TForm2.SendFileToTrash(const aFileName: TFileName; var MsgError: string);
var
  Op: TSHFileOpStruct;
begin
  {Very importante
     Include in Uses  SysUtils and ShellAPI;
  }
  MsgError := '';

  if not (FileExists(aFileName)) then
  begin
    MsgError := 'File not found.';
    Exit;
  end;

  FillChar(Op, SizeOf(Op), 0);

  Op.wFunc := FO_DELETE;
  Op.pFrom := PChar(aFileName+#0);
  Op.fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION or FOF_SILENT;

  if (ShFileOperation(Op) <> 0) then
  begin
      MsgError := 'Could not send the file to the trash.';
  end;

end;