我正在使用带有 FO_DELETE 参数的 SHFileOperationW 函数将文件移动到回收站(如果未禁用回收站)。
问题是当我以非管理员用户身份登录并以管理员身份运行我的应用程序时。这些文件被移动到管理员的回收站。
是否可以将文件移动到当前记录的非管理员用户的回收站?
我的想法是运行单独的非提升进程并将其从那里移动到回收站。但我不确定是否存在更好的解决方案。我试图在互联网上找到答案,但没有成功。
我正在使用带有 FO_DELETE 参数的 SHFileOperationW 函数将文件移动到回收站(如果未禁用回收站)。
问题是当我以非管理员用户身份登录并以管理员身份运行我的应用程序时。这些文件被移动到管理员的回收站。
是否可以将文件移动到当前记录的非管理员用户的回收站?
我的想法是运行单独的非提升进程并将其从那里移动到回收站。但我不确定是否存在更好的解决方案。我试图在互联网上找到答案,但没有成功。
我会提出以下例程 - 在 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;
一些细节很重要:
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;