procedure TForm1.CopyDirectory(subDirName, sourceDirName,
  desDirName: string);
var
  SHFileOpStruct:TSHFileOpStruct;
begin
  if SourceDirName[Length(sourceDirname)]<>'\' then
    sourceDirName:=sourceDirName+'\';
  if desDirName[Length(desDirname)]<>'\' then
    desDirName:=desDirName+'\';
  if not DirectoryExists(desDirName+subDirName) then
    CreateDir(desDirName+subDirName);  with shfileopStruct do
  begin
    wnd:=Handle;
    wFunc:=FO_Copy;
    pFrom:=PChar(sourceDirName+subdirname+'\back');
    pTo:=PChar(desDirName+subdirname);    fFlags:=FOF_ALLOWUNDO or FOF_NOCONFIRMATION;
    FAnyOperationsAborted:=False;
    hNameMappings:=nil;
    lpszProgressTitle:='文件复制中';
  end;
  if ShfileOperation(shFileOpStruct)<>0 then
    RaiseLastWin32Error;
end;写了这么一个过程,调用shfileoperation 进行文件复制,但是除了一点小问题,如果源目录d:\ddd 就会报错,找不到磁盘文件 d:\dddd 这样就会成功,也就是 奇数个字符的根目录名会报错,偶数个就不会,不知道大家遇上过没有,还是delphi包装api的bug!

解决方案 »

  1.   

    不会的,我这里很正常的
    API没包装的,API都是直接使用的,框架才有包装的说法
      

  2.   

    最好不用这个:ShfileOperation
    偶 一直 都在 API递归!
      

  3.   

    但是delphi 的api映射转换了一次,我还是觉得出现奇数个英文字符的问题很怪异,呵呵就是想知道.
      

  4.   

    在文件后面加上'#0'可以解决吧!
    如:pFrom:=PChar(sourceDirName+subdirname+'\back'+#0);
      

  5.   

    呵呵,我已经解决了,4楼的是正解本来想回来公布答案的,我来解释一下,查过msdn发现这个pFrom 和pTo一定要是null结尾的字符串,所以要在最后加上#0 chr(0)都可以,相当于c中的'/0'。如果要一个函数完成多个文件的操作要在pFrom中用#0分隔开来,pTo相应的也用#0分隔开。不过还是要谢谢4楼