用下面的代码将ShellListview中选中的文件删除到回收站:
  if ShellListView1.SelCount>0 then
  begin
      ShowMessage(ShellListview1.SelectedFolder.PathName);
      P:=ShellListView1.SelectedFolder.PathName;
      if not FileExists(P) then exit;
      FillChar(T,sizeof(T),0);
      With   T   do
      Begin
          Wnd:=0;
          wFunc:=FO_DELETE;
          pFrom:=Pchar(P);
          fFlags:=FOF_ALLOWUNDO
      End;
      SHFileOperation(T);
      ShellListView1.Refresh;
  end;结果:
当ShellListview1.SelectedFolder.PathName为下面这个时:
D:\Documents\Studio\DataManagement\资料库\000_2.sql
---------------------------
删除文件或文件夹时出错
---------------------------
无法删除 文件: 无法读源文件或磁盘。
---------------------------
但是如果我用ShellListView的右键菜单随变将选中文件改下名字,比如加个0,就可以删除了,真是奇怪
D:\Documents\Studio\DataManagement\资料库\0000_2.sql但把文件名改回去,就又不能删除了,这是怎么回事?

解决方案 »

  1.   

    改成如下即可:pFrom:=Pchar(P+#0);
    -------------------------------
    在大富翁得到上面的回答,试了一下,果然!
    但是仍很困惑,为什么会这样呢?
      

  2.   

    是文本后面缺少结束符,#0是PChar的结束符。
      

  3.   

    难道PChar(s)不会自动加上结束符?!
    为什么之前见过的绝大多数代码都是PChar(s)而不是PChar(s+#0)呢?
      

  4.   

    PChar默认是带#0的,检查一下是否是双字节的问题。
      

  5.   

    TSHFileOpStruct
    似乎是这样理解:TSHFileOpStruct.pFrom
    可以是多个文件,比如一次将多个文件删除到回收站,这时pFrom用#0分隔这些个文件:
    t.pFrom:='C:\1.txt#0C:\2.txt#0';
    所以要加一个#0
    PChar本身等同于PAnsiChar,应当是自动会以#0结束的。上面代码加的#0应当理解为文件名之间的分隔符。这样理解对不对?
      

  6.   

    我在delphi7下试了没有问题
    不知道你用的是那个版本,可能用的unicode 的版本,那个参数要专程pwidechar才行