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

在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;

SIM卡加密存漏洞 将影响数亿计的手机用户 搜狗茹立云:探索引擎产品落地 浏览器+搜索模式会成主流吗? 大势所趋,IBM Acme Air至少使用Netflix的5个开源工具 【观察】跨越“朦胧期”的云计算:产业、核心技术、生态圈以及突破点 Rovio Account:平台化之路修成正果 甲骨文总裁马克•赫德采访实录:用软硬件集成一体机打垮对手 如何一步一步打造高可扩展性的应用程序? 用Java编程,请保持简洁! 从安全隐患带来的商机来看,Hadoop同样很美 三年增四倍:如今谷歌服务占北美互联网流量四分之一 决战低功耗?Intel明年推低功耗Xeon处理器 在软件架构上增加新功能的注意事项 90后的代码界“女神”李雪:在编程中找到自己的“灵魂” 大数据之路不乏荆棘,然则其中的机遇却高于一切 iPhone销量令人意外:苹果Q3财季净利69亿美元 同比下滑 励志:12位早起的IT大佬们让小伙伴们都惊呆了 独家:苹果5周年限免神作,BADLAND开发者访谈 10亿次订阅!苹果Podcast的里程碑 免费利器Unity 4.2正式发布 支持WP8、Win8和BB10 SDCC 2013:Pinterest首位中国籍工程师两场演讲议题确定 甲骨文公布中国首届“Duke选择奖”名单 Moco、X幻想、开源中国获奖 直接拿来用,10个PHP代码片段 编程的未来 数据将成为主角 OpenCL 2.0发布,带来更强悍的异构计算能力 代码审查方式大调查 辅助工具居首(信息图) 一网打尽当下NoSQL类型、适用场景及使用公司 初创公司Treasure Data:每天处理7000亿行数据的20万次查询 豌豆荚王俊煜:将推支付SDK 与开发者3:7分成 英特尔-百度移动应用测试中心(MTC)正式启动 Intel将在2014年为数据中心用户定制低功耗SoC芯片 情绪低落?没事,让计算机来帮你! 问个问题,我一直有疑惑 BDE中建立的Access库,怎么才能打开; Access的密码为空,用户名不知道; 第四次帖了,高手在哪儿? 为什么我装了一个元件后再安装一个另外的,会把第一个冲掉? 就要去实施了,不知道什么时候才能回来,散分 我是菜鸟,问一个很菜的问题,!!!!!!!!! ATL中创建的ActiveX控件,是怎么在程序中使用的???????????? 一个关于LotusScript的一个问题。调用公试。 **请教:怎么让MSFlexgrid的一行显示一种颜色. 一个小问题,希望有人能解答! DLL高手请入,关于在DLL中引出对象的问题?????? 求教!!有关DLL调用中返回字符串类型出错的问题。 Delphi怎么实现子类化? session 和 cookie 各有千秋,区别在那里啊?敬请赐教! fm1008leaf(小幻姬(玉笛书生的徒弟)):我考考你就知道你是真是假! jneu(沧海桑田)怎么不理我?有关宏拷贝问题 paradox中的NUM类型在sql语句中是什么类型?为什么asfloat会出错? 关于J2EE的就业前景,值不值的花二万元参加一个二十天的培训,欢迎大家热烈讨论 在listbox 中,如果知道了一个Item的内容,怎么知道它的indix 今有同仁问到,三十以后咋过。恰巧心情郁闷,发上几句牢骚。 少年暗恋对象,早已嫁作人妇。那天遇见街头,孩子叫我叔叔。 OICQ问题! 如何可获得Table 内字段的类型及长度? windows2000 server 的internet 共享怎样设置权限 软件开发的请进来讨论,关于报酬的问题。大家多提建议。 1.为什么有些地方可以用MessageBox函数,有些地方不可以2.mfc的CView::OnFilePrint提供了打印的方法,要是一个程序没有视图要打印一般用什么方法? 请问在DEVELOP2000里面可以使用进度条控件吗?怎么编程实现? ???oracle监听器问题? WebBrowser控件获得网页中文本框的名称该如何写? CFtpConnection 怎样在FastReport中控制或判断所连接的数据库表到了eof? CTypedPtrList模板对象中,如何删除指定位置的元素??十分着急! ms sql server 的技术问题 怎样清除事务日志????????? 在那里改个人在cdsn.net注册信息(如名字,地秩)? 关闭窗口的事件如何触发?( 高手们请问deiphi如何实玩宏代换???????????十分火急!!!!!!! 请帮忙!!SOS!!! 请问如何实现宏代换????????????? 关于打印的一个不错的设想 我是新手,初次接触网络管理,请问要管理局域网需要具备哪些方面的知识,需要安装那些应用软件?有什么好书可以介绍吗?谢谢各位! 在VB中设计控件,其上放有uText1、Text2,当uText1失去焦点时,并不触发Validate事件 如何在程序中判断是否做了超级连接? 怎样使listview中的大图标左右居中,上下居中。 怎么样处理聊天室的退出问题? 比较大的问题,请做过JAVA系统集成方案的朋友指点!!! applet,这个霸道的家伙!怎么解决阿? c++类的一个小问题 一个大家都很棘手的问题 关天构造函数的问题 学习《windows程序设计》中的问题? pb8里的autoscript怎么弹出那么慢 消息:c++与Visaul c是不是有一定的区别呢? 硫酸铜和氯化钠反应吗? 配平化学方程式,电子转移FeSO4+HNO3 --Fe(NO3)3+ Fe2(SO4)3+N2O+H2O,麻烦把Fe和N的电子转移具体写出来 食醋有什么好处? 为什么稀硫酸不能与NaCl反应?RT. 用电子转移的知识配平化学方程式.Al+NaOH=Al(OH)3+H2 食醋都有哪些种类 氯化钠溶液和稀硫酸溶液要反应吗如果要的话,化学方程式和离子方程式分别是什么?诚谢! 维生素E 会和 烧碱 反应吗? 食盐、碱面、食醋、小苏打哪个所含元素种类最多 氯化钠溶液和稀硫酸 反应吗?为什么? 氢氧化钠与二氧化碳反应的现象就是一个实验题,向一个空瓶内加氢氧化钠溶液,然后又向起中加稀盐酸,有一个小气球.标题是证明二氧化碳与氢氧化钠反应.请问有什么现象吗?请列举三点 瓶子里的蜂蜜放了一年多了 现在观察蜂蜜表面起了很细的泡 比较多 但是瓶子密封性良好 蜂蜜还能喝吗我记得以前可能在用汤匙取蜂蜜的时候 汤匙可能沾有点水 但是肯定很少水 是不是这个 请在快速回复这几个化学式.化学式和配平一定要正确.谢谢1.碳酸钠与稀盐酸 2.碳酸钠和氢氧化钠 3.锌与稀盐酸 4.铁与硫酸铜溶液 第四单元试题 在蜂农那里买的蜂蜜放在密封塑料瓶子里半年了还能食用么.原来的一瓶现在只有半瓶了.是因为水分太多蒸发了么?有一股酒味.而且蜂蜜里有白色气泡. 怎样才能快速的配平化学式 化学配平的方程式(1) ( )p+( )FeO→( )P2O5+( )Fe(2) ( )Fe(红热)+( )H2O(气)→( )Fe3O4+H2(3) ( )N2+( )H2→( )NH3(4) ( )Al+( )Fe3O4→( )Fe+( )Al2O5这个题我半天配不出来啊,希望哥哥姐姐帮我个忙~ 镁条放入食醋中的现象实验结果是什么 厨房里能否用食醋鉴别纯碱和食盐? 问一道化学配平方程式的题K2S + HNO3 == KNO3 + NO↑+ S + H2O 镁条与食醋反应现象具体点! 盐溶液和金属反应生成什么求大神帮助同题目 方程式.必考的那种。什么都可以啦 就是必考的。 硫酸铜与食醋反应 强酸性土壤不适宜植物生长,可用来中和土壤酸性的是?A食盐B氢氧化钠C熟石灰D碳酸钠 求一道化学配平方程式!( )Fe2O3+( )CO--高温--( )Fe+( )CO2 我曾经做了个实验,把一种类似于爬山虎的植物放到了一个瓶子里,瓶子里是蜂蜜和水,本来我天天打开瓶盖换下空气,然后有大概1个星期没有换空气,然后再次打开有巨大的声音和刺激味道的气 维生素C具有酸性.根据维生素C的性质,判断下列物质中能与维生素C反应的是A 金属镁B 氯化钾C 氢氧化钠D 硫酸铜 食醋煮鸡蛋治疗什么? 高中化学选修3总结 六种白色固体,分别是碳酸钙、硫酸铜、氯化钠、氢氧化钠、稀硝酸、碳酸钠中的一种,请提出实验方法加以区别注意:不能添加除去题目以外的任何试剂 化学配平下列方程(1)Zn+HCl——ZnCl2+H2(2)KClO3——KCl+O2(3)FeCl3+NaOH——NaCl+Fe(OH)(4)Al+O2——Al2O3 谁能给我高中化学选修一的知识总结阿不要全部是方程的,帮忙啦``马上就是分班考` 我希望考的好一点` 高中化学必修一的公式 食醋可以治什么 高中化学选修4总结 用一种盐去除氢氧化钠中的碳酸钠如题,应该选用哪种盐= =|||我开始做的时候也这么觉得 食醋可以治疗 食醋的标准有什么? 初中所有的化学公式和反应现象和用途 既能与氢氧化钠又能与碳酸钠反应的盐有那些 高中化学公式怎么总结归纳 为什么硫酸铜溶液不能与氯化钠溶液发生反应 怎么用盐鉴别纯碱和烧碱?只需写出化学方程式. 高中化学计算公式总结 硫酸铜与氯化钠不能反应,为什么? 是关于金属的那章书 高二化学方程式配平和电子转移(1)KMnO4+H2O2+H2SO4=K2SO4+MnSO4+O2+H2O(2)NH4NO3=HNO3+N2+H2O 书上说硫酸铜和氯化钠不反应,但我将氯化钠溶液放入硫酸铜溶液时溶液变为绿色,这是为什么?我将这种溶液倒入蒸发皿加热,出现了浅绿色晶体,是什么东东? 怎样用0价法配平化学方程式 一定要多举几个例子啊举个例子说明一下啦 有悬赏的! 食醋作用是什么 为什么氯化钠和硫酸铜不能反应 我用0价法配平一个化学方程式中的一个小问题!为什么Cr(MnO4)2降了5?还有就是我化学方程式升降不是很清楚, 食醋有哪些作用? 化合价升降法配平KMno4+Hcl===Kcl+Mncl2+H2O+cl2 怎样根据的电子转移给化学方程式配平 食醋的作用 氯化钠与硫酸铜到底发生了什么反应今天化学试验课上我试了,反应生成绿色溶液.那个绿色溶液到底是什么啊? 【高中化学】方程式配平+电子转移分析 食醋有什么作用?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn