1

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

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

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

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

4

2 回答 2

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。
于 2017-11-22T09:42:21.103 回答
-1

When I needed to use this routine, I used the following commands. I hope it is useful.

Tests with Delphi 2010 and 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;
于 2013-11-17T17:19:12.410 回答