Delphi 我无法将文件删除到回收站

Delphi 我无法将文件删除到回收站,delphi,Delphi,我无法将文件删除到回收站 VAR SHFileOpStruct: TSHFileOpStruct; begin with SHFileOpStruct do begin wnd := Handle; wFunc := FO_DELETE; pFrom := PChar(FileName); fFlags:= 0; pTo := NIL; hNameMappings:= NIL; lpszProgressTitle:

我无法将文件删除到回收站

VAR SHFileOpStruct: TSHFileOpStruct;
begin   
  with SHFileOpStruct  do
  begin
    wnd   := Handle; 
    wFunc := FO_DELETE;
    pFrom := PChar(FileName);
    fFlags:= 0;
    pTo   := NIL;
    hNameMappings:= NIL;
    lpszProgressTitle:= NIL;
  end;
  Result:= SHFileOperation(SHFileOpStruct); 
end;
我可以删除格式为“1.xyz”的文件,但不能删除格式为“12.xyz”(文件名超过1个字符)的文件。

根据,不应使用GetLastError查看操作是否成功。检查函数的结果并使用文档找出它返回的错误。这会让你更好地了解问题所在

编辑:

阅读文档的最佳猜测:

pFrom

虽然该成员被宣布为 单个以null结尾的字符串,它是 实际上是一个可以容纳 多个以空分隔的文件名。 每个文件名都以 单个空字符。最后一个文件 名称以双NULL结尾 字符(“\0\0”)表示结束 缓冲区

因此,您应该确保pFrom以双0结尾。试试下面的方法

pFrom := PChar(FileName + #0);
另外,您使用的是什么Delphi版本

编辑2:


还要确保结构已正确初始化为0。取消对FillChar的注释

您可能需要设置fFlags:=FOF_SILENT+FOF_ALLOWUNDO+FOF_NOCONFIRMATION

这对我很有效:

function DeleteToRecycleBin(WindowHandle: HWND; Filename: string; Confirm: Boolean): Boolean;
var
  SH: TSHFILEOPSTRUCT;
begin
  FillChar(SH, SizeOf(SH), 0);
  with SH do
  begin
    Wnd := WindowHandle;
    wFunc := FO_DELETE;
    pFrom := PChar(Filename + #0);
    fFlags := FOF_SILENT or FOF_ALLOWUNDO;
    if not Confirm then
    begin
      fFlags := fFlags or FOF_NOCONFIRMATION
    end;
  end;
  Result := SHFileOperation(SH) = 0;
end;

您如何处理pFrom的内存分配?看来这可能是你的问题。内存位置最多只能容纳1.xyz,不适合12.xyz。该函数的结果是2或87(57hex)。文档中也有此提示,但我不完全理解:“此函数已在Windows Vista中被IFileOperation替换。”。这是否意味着有一个可选的替代函数,或者SHFileOperation被完全替换,在Vista下不应再使用它?参数WindowHandle需要什么窗口句柄?如果这是与{$APPTYPE CONSOLE}一起使用的话会怎么样?@tim11g在这种情况下Wnd:=0;