//变量
var
FileOp:TSHFileOpStruct;
FromBuf,ToBuf:Array[0..255] of AnsiChar;
fp:string;
//执行代码
FillChar(FromBuf,SizeOf(FromBuf),0);
FillChar(ToBuf,SizeOf(ToBuf),0);
StrPCopy(FromBuf,fp);//fp是源路径
StrPCopy(ToBuf,Edit1.Text);
FileOp.Wnd := Handle;
FileOp.pFrom := @FromBuf;
FileOp.pTo := @ToBuf;
FileOp.wFunc := FO_COPY;
FileOp.fFlags := FOF_NOCONFIRMATION OR FOF_MULTIDESTFILES;
FileOp.fAnyOperationsAborted := False;
FileOp.hNameMappings := nil;
FileOp.lpszProgressTitle := '正在移动文件,请稍候...';
if SHFileOperation(FileOp) <> 0 then
begin
Application.MessageBox('复制失败!','提示',MB_ICONINFORMATION);
IsOk := False;
Exit;
end;代码在xp下没问题,win7在执行SHFileOperation时有如下提示:
求教
// 对文件进行操作
var
FData: TShFileOpStruct;
begin
FillChar(FData, SizeOf(TShFileOpStruct), 0);
FData.pFrom := pchar(fFROM + #0);
// 设立数据源路径和文件、目录名,支(?,*通配符)
if fTO <> '' then
if fTO[length(fTO)] <> '\' then
fTO := fTO + '\';
FData.pTo := pchar(fTO + #0); // 设立目标路径
case Action of
0:
FData.wFunc := FO_COPY; // copy
1:
FData.wFunc := FO_MOVE; // move
2:
FData.wFunc := FO_DELETE; // delete
3:
FData.wFunc := FO_RENAME; // rename,未使用
else
FData.wFunc := FO_COPY;
end;
FData.fFlags := FOF_ALLOWUNDO or FOF_CONFIRMMOUSE;
if ExtractFilePath(fFROM) = fTO then
FData.fFlags := FOF_RENAMEONCOLLISION;
FData.fAnyOperationsAborted := false;
FData.hNameMappings := nil;
case Action of
0:
FData.lpszProgressTitle := '复制文件'; // copy
1:
FData.lpszProgressTitle := '移动文件'; // move
2:
FData.lpszProgressTitle := '删除文件'; // delete
3:
FData.lpszProgressTitle := '重命名'; // rename
end;
Result := ShFileOperation(FData) = 0;
end;.
把AnsiChar都改成string;
{
复制目录对话框
}
var
fo: TSHFILEOPSTRUCT;
begin
FillChar(fo, SizeOf(fo), 0);
with fo do
begin
Wnd := GetActiveWindow;
wFunc := FO_COPY;
pFrom := PChar(source + #0);
pTo := PChar(Dest + #0);
if UI then
fFlags := FOF_ALLOWUNDO
else
fFlags := FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR;
end;
Result := (SHFileOperation(fo) = 0);
end;