说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

在Delphi中实现对目录拷贝、删除和搬移的操作

HTML文档下载 WORD文档下载 PDF文档下载
在Delphi中实现对目录拷贝、删除和搬移的操作

笔者在工作中遇到了需要对目录进行拷贝、删除和搬移的需求,Delphi本身提供了一些目录操作函数,但只是针对空目录而言,对目录下带有子目录的情况,更是无能为力。利用Win32 API函数和结构,以及递归的程序设计思想,笔者实现了对任意目录进行拷贝、删除和搬移的功能(分别相当于DOS中的XCopy、DelTree和Move命令)。以下分别给出了实现代码:

1、拷贝目录

为了能拷贝目录下带有子目录的情况,先定义一个辅助的拷贝函数,它是递归执行的,直到把目录下的所有文件和子目录都拷贝完。

1.1拷贝目录的递归辅助函数:DoCopyDir

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< >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=

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;

1.2拷贝目录的函数:CopyDir

function CopyDir(sDirName:String;

sToDirName:string):Boolean;

begin

if Length(sDirName)< =0 then

exit;

//拷贝...

Result:=DoCopyDir(sDirName

sToDirName);

end;

2、删除目录

删除目录与拷贝目录很类似,但为了能删除位于根目录下的一个空目录,需要在辅助函数中设置一个标志变量,即:如果删除的是空目录

则置bEmptyDir为True,这一句已经用深色框表示了。

2.1删除目录的递归辅助函数:DoRemoveDir

function DoRemoveDir(sDirName:String):Boolean;

var

hFindFile:Cardinal;

tfile:String;

sCurDir:String;

bEmptyDir:Boolean;

FindFileData:WIN32_FIND_DATA;

begin

//如果删除的是空目录

则置bEmptyDir为True

//初始时

bEmptyDir为True

bEmptyDir:=True;

//先保存当前目录

sCurDir:=GetCurrentDir;

SetLength(sCurDir

Length(sCurDir));

ChDir(sDirName);

hFindFile:=FindFirstFile('*.*'

FindFileData);

if hFindFile< >INVALID_HANDLE_VALUE then

begin

repeat

tfile:=FindFileData.cFileName;

if (tfile='.') or (tfile='..') then

begin

bEmptyDir:=bEmptyDir and True;

Continue;

end;

//不是空目录

置bEmptyDir为False

bEmptyDir:=False;

if FindFileData.dwFileAttributes=

FILE_ATTRIBUTE_DIRECTORY then

begin

if sDirName[Length(sDirName)]< >'\' then

DoRemoveDir(sDirName+'\'+tfile)

else

DoRemoveDir(sDirName+tfile);

if not RemoveDirectory(PChar(tfile)) then

result:=false

else

result:=true;

end

else

begin

if not DeleteFile(PChar(tfile)) then

result:=false

else

result:=true;

end;

until FindNextFile(hFindFile

FindFileData)=false;

FindClose(hFindFile);

end

else

begin

ChDir(sCurDir);

result:=false;

exit;

end;

//如果是空目录

则删除该空目录

if bEmptyDir then

begin

//返回上一级目录

ChDir('..');

//删除空目录

RemoveDirectory(PChar(sDirName));

end;

//回到原来的目录下

ChDir(sCurDir);

result:=true;

end;

2.2删除目录的函数:DeleteDir

function DeleteDir(sDirName:String):Boolean;

begin

if Length(sDirName)< =0 then

exit;

//删除...

Result:=DoRemoveDir(sDirName) and RemoveDir(sDirName);

end;

3、移动目录

有了拷贝目录和删除目录的函数,移动目录就变得很简单,只需顺序调用前两个函数即可:

function MoveDir(sDirName:String;

sToDirName:string):Boolean;

begin

if CopyDir(sDirName

sToDirName) then

if RemoveDir(sDirName) then

result:=True

else

result:=false;

end;

专访4秒源码商城CTO陈杰:扎根互联网的“不安的心” iOS UIView动画实践(一):揭开Animation的神秘面纱 【前端人生】Teambition前端工程师陈涌:非计算机专业,依托社区不断成长壮大 iOS UIView动画实践(二):Spring Animation与人机交互 基因组与数据整合:DNA应用开发正在临近 2015 PHP框架调查结果出炉,Laravel最受欢迎! 【CTO会员专访】KEEN创始人兼CEO王琦:在GeekPwn,遇见一极棒的安全人才 创业公司都在使用的3款Python库 深入理解Objective-C的Runtime机制 你不知的Docker 创办人兼CTO游走美法的浪漫狂放 《近匠》环信CEO刘俊彦:移动客服的未来化场景 iOS UIView动画实践(三):Transition Animation 【CTO讲堂】无社交,不App!——为App加载强大的通讯社交引擎 【探秘ES6】系列专栏(七):箭头函数 【前端框架】Backbone.js在大型单页面应用中的应用实践 【探秘ES6】系列专栏(六):解构赋值 《近匠》TestBird,专注的手游自动化云测试平台 【探秘ES6】系列专栏(八):JS的第七种基本类型Symbols 专访李林锋:我与Netty那些不得不说的事 手把手教学:巧用Core Data和RubyMotion开发iOS应用 《近匠》琥珀天气,精细化打磨征服Google Play 【CTO讲堂】人工智能到底能为我们带来什么? Linksys再度回归中国市场,主推智能路由 Windows 10:全平台战舰与移动化破冰——微软(中国)操作系统工程院院长谢育涛专访 专访友盟CEO叶谦:深挖海量终端用户数据的价值 七牛资深前端工程师马逸清:前端测试探索实践 实战iOS 9:开发者必须掌握的三种搜索API 腾讯Bugly干货分享:浅谈Swift在实际项目中的应用 【前端人生】ThoughtWorks黄峰达:利用横向扩展方式,快速学习前端新框架 这是前端最好的时代——论前端的“三化”建设 游戏引擎网络开发者的64做与不做(一):客户端方面 请问在vbscript中怎样判断一个数,是否能被3整除 MSN Messenger5.0发送文件到MSN Messenger4.6,为什么总是连接不上? sql2000的问题,谁能知道? 100分:誰有thinking in java 2 的中文電子書和例子代碼,給我一份吧? 关于将图形放大缩小的问题. jsp后缀名大小写问题(急,在线等!) sourceforge主站上不去了,那还有比较大的sourceforge站点?最好是美国的。 如何取得一个程序的内存占用率,cpu使用率等信息呢? 如何解决MSN Messenger5.0不能发送文件给MSN Messenger4.6的问题? 怎样把时间放到数据库表里,格式需要转换吗? 文件操作,帮个忙吧? simple question 60 points wait for your picking 如何卸载rose 分虽小,结得快的啊!讨论一下…… option explicit是什么意思 大哥大姐们!看一下嘛!帮帮我! 又一次被奶牛拒掉,而且有了注册机。 simple question 60 points wait for your picking (菜鸟的问题)在EditBox中怎么换行? 超级难题 SQL如何写??? 如何让WinCE支持DVDROM 請問如何在ASP.NET中實現從客戶機上傳文件到服務器? 新手问:我声明api,但是参数里有我没有定义的类型,pb报错,怎么办 关于Tclientdataset中commandtext的问题 关于按扭的简单问题 调用ejb的错误,请帮忙看看,帮我顶顶也给分,谢谢 关于lei的配置问题 java中 ,换行为\r\n ,空格为什么呢???? 关于快速排序的问题?在线等待!!! 如何在网页上显示动态图表?(送100分) 高兴,散分,收集故事喽,多讲多得,不讲不得。请斑竹留情,不要删除。 一个文件上传的bean编译成功了,但不会使,哪位用过,请给出使用的源代码,或者其它能实现上传的也行,越简单越好并附说明的 我想在触发器中得到对当前表的SQL操作的内容,应该如何实现??v$sql视图中有相关的信息,如何提取?? 心情好好,散分,各位谈谈LINUX和UNIX的感受啊:) Can u help me? 在B/S下如何根据不同用户来相应的mail库 insert into 求解! 各位高手帮帮忙,关于存储过程的问题 请教:VFP6在表单1中,关闭表单1打开表单2。结果显示表单2后,表单1又显示了一下才关闭。怎样让表单1直接关闭呢?谢谢! 很简单的问题--可是我不懂如何用javascript实现弹出窗口(无菜单和工具条的) 请高手帮忙有关“邮件多播”的问题。 《Oracle Pro *C/C++设计》的下载 哪位有最简单的SERVLET的里子,包括添加,查询。。。 水园的人有没有搞过聚会啊? SOS,用脚本连接数据库问题,100分求助,请帮忙。 救救我!SOS!SOS! 请问谁有恩雅的Mp3下载地址吗? 提示wscript未定义?该如何改呢? 关于C#遍译可执行程序问题 请高手看看,这个问题很有意义!为了同时查询不同的数据库(在不同的服务器上),请问用ASP怎么样实现多线程查询不同的库? 我是初学者,在开发ejb中,请问update、add和delete 的操作 ,在session bean中直接写sql来updat、add、delete语句对库操作行吗?还是在e 如何写英语日记以提高英语水平 英语,是一门很重要的学科,我们都要认真学习它.对英语感兴趣的那些同学会觉得英语很有趣.那些对英语没兴趣的同学会觉得英语很无聊、但是,无论你喜欢不喜欢英语,你都要认真学习,因为英 作文我眼中的同学 keep in touch with和keep up with有什么区别?如题 keep in touch with 是与某人保持联系 keep up with也有这一层的意思,那么他俩有什么区别吗?是用法不同吗? ju:英语音标 读 hurry 用be动词适当形式填空(am,is,are) 音标JU;读什么给个土音 Hurry 用be动词的适当形式am,is或are填空1."I"__the ninth letter in the ABC.2.It __an English book.3.--__ you a teacher?--No.I__ a nurse.4.20161009__her ID card number. ju用音标怎么读 “hurry 英语年月日记法告诉我英国人和美国人两种年月日记法.是年月日,记法,不是年月,日记法例如2008年8月8日用英语怎样表示? 音标:ju怎么读?juin怎么读? 朋友推荐英语口语韦博英语,我了解过酷酷口语怎么样呢? 改病句:灿烂的阳光柔和地洒向春天的田野,怎么改, 英语是不是所有学科中最简单的啊? Hurry up!恳请英语大神帮忙详细解释一下关于虚拟语气的一个疑问,跪谢!如题:虚拟语气中,与现在事实相反的假设(虚拟条件句)从句用:If +主语+动词的过去式(动词be用were)表示,主句用:主 灿烂的阳光柔和地洒向春天的田野急……用用用用用快回复一天之内 give怎么变过去式? Hurry up!数学达人快来,麻烦详细解释一道填空题的参考解释,答得好的,如题:已知正四面体(所有棱长都相等的三棱锥)的俯视图如图所示,其中四边形ABCD是边长为2cm的正方形,则这个正四面体 以try to keep up with me开头的英文歌叫什么名字 以[ju;]为音标的5字母单词,以p开头 SPEED DRIVER 2 那辆选不到的车十什么情况?有辆黑影的车,全都是?能选吗,怎么选 冬天快完了,春天就要来,太阳特别温和(修改病句) 是只发/ju:/音的单词,音标就只有/ju:/这一个. 作文《我眼中的同学》 描写秋的成语(4个) 英语翻译I think the people ____ _____ _____ _____ ______ are really cool . 定语从句 the speed ( ) you drive your car mustn't be too highA in which B at which C by which D on which 我现在是高一 我的英语笔记有好多 我该怎样去处理它们呢 笔记太多是不是有什么不好啊 音标带ju的单词 Despite the traffic lights ahead,the car continued ______ full speed.A withB inC onD at 找人帮写英语日记!普通的就可以,不要太多! 怎么努力怎么拼才可以实现我的理想,考上复旦.从这个学期的期中考之后我就开始拼了,每节课下课就开始做题,不会的就去问同学问老师.回到家里休息一下听听音乐就又开始做题看书,做到10 Although the traffic is not busy, he likes to drive at a _______ speed. 还有好多作业没做 昨天背英语呢 5篇征文6篇日记 怎么办啊帮帮我吧 以[ju:]为音标的5字母单词 single和Hurry up分别是啥意思? 同性恋的英文是什么? 英语怎么说?如题.简短一点.一句就够 hurry 修改病句:此时此刻,我身边又回想着快乐童真的歌声,诲人不倦的心声和尽情嬉闹的身影. 失之交臂怎么解释?怎么造句?它的近义词是什么?…………哈哈哈 We should help him write letters改为否定句如题 此时此刻,我耳边又回响着充满墨香的书声,快乐童真的歌声,尽情嬉闹的笑声,诲人不倦的心声;我眼前又浮现出引人入胜的课堂,又去开心的郊游,你追我赶的赛场……仿写这整个句子,用排比的 下面是一组近义词,请你先辨析它们意思上的细微差别,然后造句.模模糊糊—— 迷迷糊糊—— som time,sometime,some times,sometimes的区别谁能告诉我这四个短语的区别啊,应该怎么用? 近天郊游,同学们即更高兴又开心地玩了一天【修改病句】 You should write him a letter.改为同义句:You should ____ _____ ____ 高中生背英语课文有助于提高成绩吗 此时此刻,我耳边又回响着充满墨香的书声,快乐童真的歌声,尽情嬉闹的笑声,诲人不倦的心声;我(看补充)此时此刻,我耳边又回响着充满墨香的书声,快乐童真的歌声,尽情嬉闹的笑声,诲人 You should { write a letter to him}对大括号里的You should { write a letter to him}对大括号里的句子进行提问.答案的格式要对应What ( )i( “get 我眼前又浮现出引人入胜的课堂,热火朝天的劳动,有趣开心的郊游.(用我眼前又浮现出造句) 英语这门学科有趣吗? get up什么意思? 每天坚持写英语日记,英语能提高吗? 英语翻译:据说,新学期又开设了初中化学,这是一门很有趣的学科. 我眼中的同学作文
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘