DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: hfh9801
今日帖子: 0
在线用户: 3
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 sl220 (sl220) ★☆☆☆☆ -
普通会员
2003/8/8 14:16:45
标题:
一个关于文件夹复制的问题 浏览:2249
加入我的收藏
楼主: 我用SHFileOperation做了一个目录拷贝函数,但是在拷贝过程中如果遇到了无法复制的文件,程序就终止了,我想能不能跳过无法复制的文件,让程序继续执行,程序如下:
procedure TForm1.Button1Click(Sender: TObject);
var
 FileOpStruct :TSHFileOpStruct;
 Buf1 :array [0..127] of Char;
 Buf2 :array [0..127] of Char;
 Str1,Str2 :String;
begin
 Str1 :=edit2.Text;
 Str2 :=edit1.Text;
 FillChar(Buf1,SizeOf(Buf1),0);
 FillChar(Buf2,SizeOf(Buf2),0);
 StrPCopy(Buf1,Str1);
 StrPCopy(Buf2,Str2);
 with FileOpStruct do
 begin
   Wnd:=Handle;
   wFunc:=FO_COPY;
   pFrom:=@Buf1;
   pTo:=@Buf2;
   fFlags:=FOF_ALLOWUNDO;
   fAnyOperationsAborted:=False;
   hNameMappings:=nil;
   lpszProgressTitle:='拷贝文件';
 end;
 SHFileOperation(FileOpStruct);
end;

end.
----------------------------------------------
-
作者:
男 boy (阿門) ★☆☆☆☆ -
盒子活跃会员
2003/8/8 19:19:33
1楼: 判斷檔案的屬性是否唯讀,隱藏,系統作決定
----------------------------------------------
Delphi開發◆伺服器架設◆免安裝APACHE,PHP,CGI Perl, MYSQL ★
作者:
男 bios (阿贡) ★☆☆☆☆ -
盒子中级会员
2003/8/9 9:06:40
2楼: 寻找资料中请等待。。。
----------------------------------------------
按此在新窗口浏览图片
按此在新窗口浏览图片
作者:
男 bios (阿贡) ★☆☆☆☆ -
盒子中级会员
2003/8/9 9:13:03
3楼: function CopyDir(sDirName:String;
sToDirName:string):Boolean;
begin
if Length(sDirName)<=0 then
exit;
//拷贝...
Result:=DoCopydir(sDirName,sToDirName);
end;


function DoCopyDir(sDirName:String;
sToDirName:String):Boolean;
var
hFindFile:Cardinal;
t,tfile :String;
sCurDir:String[255];
FindFileData:WIN32_FIND_DATA;
begin
//先保存当前目录
sCurDir:=GetCurrentDir;
ChDir(sDirName);
hFindFile:=FindFirstFile(*.*,FindFileData);
if hFindFile>0 then
begin
if not DirectoryExists(sToDirName) then
ForceDirectories(sToDirName);
repeat
tfile :=FindFileData.cFileName;
if (tfile=.) or (tfile=..) then
Continue;
if FindFileData.dwFileAttributes=
FILE_ATTRIBUTE_DIRECTORY then
begin
t:=sToDirName+\+tfile;
if not DirectoryExists(t) then
ForceDirectories(t);
if sDirName[Length(sDirName)]<>'\ 'then
DoCopyDir(sDirName+\+tfile,t)
else
DoCopyDir(sDirName+tfile,sToDirName+tfile);
end
else
begin
t:=sToDirName+\+tFile;
CopyFile(PChar(tfile),PChar(t),True);
end;
until FindNextFile(hFindFile,FindFileData)=false;
FindClose(hFindFile);
end
else
begin
ChDir(sCurDir);
result:=false;
exit;
end;
//回到原来的目录下
ChDir(sCurDir);
result:=true;
end;

----------------------------------------------
按此在新窗口浏览图片
按此在新窗口浏览图片
作者:
男 bbhorse (xinhua2008) ★☆☆☆☆ -
盒子活跃会员
2003/8/9 9:23:58
4楼: 能不能加多一点中文说明呀
----------------------------------------------
愿和所有喜欢DELPHI的人做朋友!
作者:
男 bios (阿贡) ★☆☆☆☆ -
盒子中级会员
2003/8/9 14:35:22
5楼: 真的对不起我很忙了,只是
随手一贴,抱歉
----------------------------------------------
按此在新窗口浏览图片
按此在新窗口浏览图片
作者:
男 sl220 (sl220) ★☆☆☆☆ -
普通会员
2003/8/11 9:56:07
6楼: 楼上的朋友谢谢,不过你的这个函数我早就用过了,存在不少问题,例如隐藏文件夹就无法COPY,而且这个函数拿来还要修改一下,不然编译部过去,不过还是很感谢各位~~
----------------------------------------------
-
作者:
男 bios (阿贡) ★☆☆☆☆ -
盒子中级会员
2003/8/11 10:33:49
7楼: 我找时间研究一下,你研究出来了吗?
如果研究出来,可以贴出来供大家共享吗?谢谢
----------------------------------------------
按此在新窗口浏览图片
按此在新窗口浏览图片
作者:
男 sl220 (sl220) ★☆☆☆☆ -
普通会员
2003/8/11 13:46:56
8楼: function DoCopyDir(sDirName:String;
sToDirName:String):Boolean;
  var
    sr:TsearchRec;
    hFindFile:Cardinal;
    t,tfile :String;
    sCurDir:String[255];
    FindFileData:WIN32_FIND_DATA;
    Attrs:Integer;
  begin
  //先保存当前目录
    sCurDir:=GetCurrentDir;
    try
    ChDir(sDirName);//改变当前目录为‘SDirName’
    except
    exit;
    end;
     //showmessage(sdirname);
    hFindFile:=FindFirstfile('*.*',FindFileData);//把找到的第一个文件赋给hfindFile
    if hFindFile<>INVALID_HANDLE_VALUE  then
      begin
        if not DirectoryExists(sToDirName) then
          ForceDirectories(sToDirName); //判断目标目录是否存在,如果不存在,则创建该多级目录
        repeat
          tfile :=FindFileData.cFileName; //搜索所在目录下的所有文件
          if (tfile='.') or (tfile='..')then
            Continue;
          if (FindFileData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) =FILE_ATTRIBUTE_DIRECTORY then
            begin
              t:=sToDirName+'\'+tfile;
              if not DirectoryExists(t) then
                ForceDirectories(t); //判断目录是否存在,如果没有则建立目录
              //if sDirName[Length(sDirName)]<>'\' then
               // begin
                DoCopyDir(sDirName+'\'+tfile,t);//如果路径后不带'\',则需加上
                 Attrs:=FileGetAttr(sDirName+'\'+tfile);
                 FileSetAttr(t,Attrs);
                // end
             // else
               // begin
               // DoCopyDir(sDirName+tfile,sToDirName+tfile);
               //  Attrs:=FileGetAttr(sDirName+tfile);
               //  FileSetAttr(t,Attrs);
             //    end;
            end
          else
            begin
                t:=sToDirName+'\'+tFile;
                CopyFile(PChar(tfile),PChar(t),True);
            end;
         until FindNextFile(hFindFile,FindFileData)=false;
           //FindClose(hFindFile);
      end
    else
      begin
        ChDir(sCurDir);
        result:=false;
        exit;
      end;
  //回到原来的目录下
  ChDir(sCurDir);
  result:=true;
  end;


//拷贝函数:CopyDir
function CopyDir(sDirName:String;
sToDirName:string):Boolean;
begin
if Length(sDirName)<=0  then
exit;
//拷贝...
 Result:=DoCopyDir(sDirName,sToDirName);
 end;
功能基本实现,还有些小地方有待改进
----------------------------------------------
-
作者:
男 bios (阿贡) ★☆☆☆☆ -
盒子中级会员
2003/8/11 14:49:49
9楼: ok我分析一下,有没办法改进!
----------------------------------------------
按此在新窗口浏览图片
按此在新窗口浏览图片
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行100.0977毫秒 RSS