2011-06-13 54 views
4

我無法將文件刪除到回收站。我無法將文件刪除到回收站

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個字符)。

+0

你如何處理pFrom的內存分配?似乎這可能是你的問題。內存位置只能容納1.xyz,不適合12.xyz。 – 2011-06-13 15:20:55

回答

10

根據the documentation of SHFileOperation,您不應該使用GetLastError來查看操作是否成功。檢查函數的結果並使用文檔找出它返回的錯誤。這應該讓你更好地瞭解問題所在。

編輯:

從閱讀文檔

的最佳答案:

pFrom中

雖然這個成員被聲明爲 單空值終止字符串,它是 實際上是一個緩衝區,可以保存 多個空分隔文件名。 每個文件名都以 單個NULL字符結尾。最後一個文件 名端接一個雙NULL字符 (「\ 0 \ 0」)來指示緩衝區末尾

所以你應該確保pFrom中與雙0結束試用以下

pFrom := PChar(FileName + #0); 

此外,你使用的是什麼德爾福版本?

EDIT2:

同時確保結構正確初始化爲0取消對FillChar

+0

該函數的結果是2或87(57hex)。 – Ampere 2011-06-13 15:22:15

+0

在文檔中也有這樣的提示,但我完全不明白:「這個函數在Windows Vista中被IFileOperation取代」。這是否意味着有一個可選的替代功能,或者SHFileOperation被完全替換了,它不應該在Vista下使用? – Ampere 2011-06-13 15:25:58

-1

您可能需要設置FFLAGS:= FOF_SILENT + FOF_ALLOWUNDO + FOF_NOCONFIRMATION

+0

FOF_NOCONFIRMATION也不起作用 – Ampere 2011-06-14 13:19:44

4

這對我的作品:

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; 
+0

參數WindowHandle需要什麼窗口句柄?如果這與{$ APPTYPE CONSOLE}一起使用會怎麼樣? – tim11g 2015-02-21 23:23:03

+0

@ tim11g在這種情況下Wnd:= 0; – 2016-06-29 13:08:14