用下面的代码将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但把文件名改回去,就又不能删除了,这是怎么回事?
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但把文件名改回去,就又不能删除了,这是怎么回事?
-------------------------------
在大富翁得到上面的回答,试了一下,果然!
但是仍很困惑,为什么会这样呢?
为什么之前见过的绝大多数代码都是PChar(s)而不是PChar(s+#0)呢?
似乎是这样理解:TSHFileOpStruct.pFrom
可以是多个文件,比如一次将多个文件删除到回收站,这时pFrom用#0分隔这些个文件:
t.pFrom:='C:\1.txt#0C:\2.txt#0';
所以要加一个#0
PChar本身等同于PAnsiChar,应当是自动会以#0结束的。上面代码加的#0应当理解为文件名之间的分隔符。这样理解对不对?
不知道你用的是那个版本,可能用的unicode 的版本,那个参数要专程pwidechar才行