MFC递归复制文件夹
Dec 21, 2013
上一篇中使用CFileFind实现了递归删除文件夹。这一篇继续使用CFileFind类实现文件夹的复制。
文件title\name\path的区分 #
开始之前,先讲一下文件最常用的三个属性title、name、path的区分。比如如下代码
CFile file("C:/note/file.txt",CFile::modeRead);
CString szPath = file.GetFilePath();
CString szName = file.GetFileName();
CString szTitle = file.GetFileTitle();
AfxMessageBox("Path : "+szPath);
AfxMessageBox("Name: "+szName);
AfxMessageBox("Title: "+szTitle);
请问输出的结果是什么?
name和path很好理解,前者是文件名,后者是文件路径。那么name和title有何区别? 如果你文件夹选项中,设置的是显示文件后缀名,程序结果是
Path: C:/note/file.txtAfxMessageBox("Path : "+szPath);
Name: file.txt
Title: file.txt
如果你文件夹选项中,设置的是隐藏文件后缀名,程序结果是
Path: C:/note/file.txtAfxMessageBox("Path : "+szPath);
Name: file.txt
Title: file
可以看出区别了。Path是全路径+文件名,包括后缀名;name是文件名,包括后缀名;title是文件显示的名字,如果系统显示了后缀名,则其包括后缀名,否则不包括。
递归复制文件夹 #
MFC 中提供了一系列文件夹管理函数,却没有复制、移动文件夹这种基本操作函数
不过,按照上篇中递归的思想,仍旧可以实现复制文件夹,无论其非空与否。
实现代码
void myCopyDirectory(CString source, CString target)
{
CreateDirectory(target,NULL); //创建目标文件夹
//AfxMessageBox("创建文件夹"+target);
CFileFind finder;
CString path;
path.Format("%s/*.*",source);
AfxMessageBox(path);
bool bWorking = finder.FindFile(path);
while(bWorking){
bWorking = finder.FindNextFile();
AfxMessageBox(finder.GetFileName());
if(finder.IsDirectory() && !finder.IsDots()){ //是文件夹 而且 名称不含 . 或 ..
//递归创建文件夹+"/"+finder.GetFileName()
myCopyDirectory(finder.GetFilePath(),target+"/"+finder.GetFileName());
}
else{ //是文件 则直接复制
//AfxMessageBox("复制文件"+finder.GetFilePath());//+finder.GetFileName()
CopyFile(finder.GetFilePath(),target+"/"+finder.GetFileName(),FALSE);
}
}
}
使用CFindFile对象,判断源文件夹的子项是文件还是文件夹,如果是文件,则直接copy过去,如果是文件夹则递归复制该子文件夹。
如果要实现递归移动,思路相同,区别在于复制过程中复制完一项就要删除源文件夹中相应的项。或者更简单
递归移动=递归复制+递归删除
该文2010-08-03 13:00首发于我的CSDN专栏。有改动。