type <br> _SHFILEOPSTRUCTA = packed record<br> Wnd: HWND;<br> wFunc: UINT;<br> pFrom: PAnsiChar;<br> pTo: PAnsiChar;<br> fFlags: FILEOP_FLAGS;<br> fAnyOperationsAborted: BOOL;<br> hNameMappings: Pointer;<br> lpszProgressTitle: PAnsiChar; { only used if FOF_SIMPLEPROGRESS }<br> end; <br>hwnd:用来显示操作状态的对话框句柄。 例中是form1的句柄<br>wFunc:执行的操作。可以是以下各值:(例中是FO_COPY)<br> FO_COPY:拷贝pfrom域中指定的(目录,例中是'c:/a')到pto中指定的位置(例中为'c:/b') <br> FO_DELET:删除pfrom中指定的文件. (pTo不用) <br> FO_MOVE:移动PFrom中指定的文件到pto中指定的位置。 <br> FO_RENAME:给PFrom中指定的文件改名。<br>pFrom:指定一个或多个源文件名的缓冲区地址。多个名字必须用NULL分隔。名字列表必须用两个NULL(nil,'/0')来结束。<br>pTo:目标文件或目录名缓冲区地址。 如果fFlags域指定FOF_MULTIDESTFILES,缓冲区可以包含多个目标文件名。多个名字必须用NULL分隔。名字列表必须用两个NULL(nil,'/0')<br>fFlags :控制操作的标志,可以是以下各值组合:<br> FOF_ALLOWUNDO:保留Undo信息, 如果pFrom没有包含全的绝对的路径或文件名此值忽略。<br> FOF_CONFIRMMOUSE:没有实现.<br> FOF_FILESONLY:只有文件名使用通配符时(*.*)才对文件操作。<br> FOF_MULTIDESTFILES: pTo域指一定了多个目标文件.(一个对就一个源文件) 而不是指定一个目录来存放所有源文件 <br> FOF_NOCONFIRMATION:所有显示的对话框全部选择yes to all<br> FOF_NOCONFIRMMKDIR: 如果需要创建一个新目录不确认。<br> FOF_NOCOPYSECURITYATTRIBS: 4.71. Microsoft&reg; Windows NT&reg; only. 安全属性不复制.<br> FOF_NOERRORUI:发生错误时不提供用户接口。<br> FOF_RENAMEONCOLLISION: move,copy,rename操作时如目标文件存在,给操作的文件另起一个名字。<br> FOF_SILENT:不显示进度对话框<br> FOF_SIMPLEPROGRESS:显示进度对话框但不显示文件名。<br> FOF_WANTMAPPINGHANDLE:如果指定了FOF_RENAMEONCOLLISION 当任何文件改名时将填写hNameMappings 域<br>fAnyOperationsAborted:当用户在完成前取消任何文件操作时赋值TRUE,否则FALSE.<br>hNameMappings:一个包含SHNAMEMAPPING结构数组的文件名映射对象句柄. 每一个(SHNAMEMAPPING)结构包括一个旧的或新的目录名为了每一个移动的复制的改名的文件。这个域仅在fFlags域包括FOF_WANTMAPPINGHANDLES标志时使用。句柄必须使用SHFreeNameMappings来释放(用完后)<br>lpszProgressTitle :进程对话框的标题串地址。仅在fFlags中包括FOF_SIMPLEPROGRESS标志时使用。<br><br>如果pFrom和pTo不是一个绝对目录时,当前目录从全局当前盘符和当前目录中取得,同时目录设置由GetCurrentDirectory 和SetCurrentDirectory 函数维护.<br><br>var<br> sPath: string;<br> fsTemp: SHFILEOPSTRUCT;<br> Flags: FILEOP_FLAGS;<br> i, t: integer;<br>begin<br> Flags := 0;<br> if FileListView.Items.Count < 0 then<br> exit; /////////<br> sPath := bsSkinDirectoryEdit1.Text;<br> Flags := Flags + FOF_ALLOWUNDO;<br> Flags := Flags + FOF_RENAMEONCOLLISION;<br> Flags := Flags + FOF_SILENT;<br> Flags := Flags + FOF_NOCONFIRMMKDIR;<br> if sPath <> '' then<br> begin<br> try<br> fsTemp.Wnd := Self.Handle; //设置文件操作类型<br> fsTemp.wFunc := FO_COPY;<br> fsTemp.fFlags := Flags;<br> for i := 0 to FileListView.Items.Count - 1 do<br> //允许执行撤消操作 //////////<br> begin //源文件全路径名<br> fsTemp.pFrom := PChar(FileListView.Items.Item.Caption + #0#0);<br> fsTemp.pTo := PChar(sPath + #0#0); //要复制到的路径<br> fsTemp.lpszProgressTitle := '拷贝文件';<br> if SHFileOperation(fsTemp) <> 0 then<br> begin<br> statelbl.Caption := IntToStr(i) + '' + '文件复制不成功!';<br> end<br> else<br> begin<br> statelbl.Caption := IntToStr(i) + '' + '文件复制成功!';<br> end;<br> end;<br> except<br> MessageDlg('文件复制失败!', mtInformation, [mbYes], 0);<br> end;<br> end;<br>end;