Qt没有直接提供复制文件夹及文件夹下的文件,而是提供了另外两个函数。
创建文件夹bool QDir::mkpath(const QString &dirPath)
移动文件bool QFile::copy(const QString &fileName, const QString &newName)
通过这两个函数很简单就能写出递归复制文件夹及其内容的函数。
.cpp
bool PosService::CopyFolder(const QString &p_sUploadDate, QString p_sSourcePath, QString p_sTargetPath, QString &p_sMessage)
{
m_PosRecord.hkLogForRun("文件复制","文件移动");
QDir sourceDir(p_sSourcePath);
//判断源文件夹是否存在,不存在则返回
if(!sourceDir.exists())
{
p_sMessage = "移动文件夹出错:源文件夹" + p_sSourcePath + "不存在";
return false;
}
//判断目标文件夹是否存在,没有则创建一个
QDir targetDir(p_sTargetPath);
if(!targetDir.exists())
{
if(!targetDir.mkpath(p_sTargetPath))
{
p_sMessage = "移动文件夹出错:目标文件夹" + p_sSourcePath + "创建失败";
return false;
}
}
//去掉.和..文件,..代表上一层,.代表当前,一般每个文件夹都会有这两个隐藏文件
sourceDir.setFilter(QDir::NoDotAndDotDot | QDir::AllEntries);
//获取该文件夹内所有文件除.和..以外
QStringList sourceFileList = sourceDir.entryList();
//遍历源文件夹列表
for(auto& sourceFile : sourceFileList)
{
QFileInfo fileInfo(p_sSourcePath + sourceFile);
if(!fileInfo.baseName().contains(p_sUploadDate))
{
continue;
}
//判断是否是文件
if(fileInfo.isFile())
{
QFile file(p_sTargetPath + sourceFile);
//如果文件重名则不执行拷贝
if(!file.exists())
{
//没有则执行拷贝
if(!QFile::copy(p_sSourcePath + sourceFile,p_sTargetPath + sourceFile)){
p_sMessage = "移动文件夹出错:源文件夹下文件" + p_sSourcePath + sourceFile + "向"
+ p_sTargetPath + sourceFile + "拷贝时失败";
return false;
}
}
}
//判断是否是文件夹
if(fileInfo.isDir())
{
//如果文件夹重名则不执行拷贝
if(!targetDir.exists(targetDir.absolutePath() + "/" + sourceFile))
{
//如果不重复则执行拷贝文件
if(!targetDir.mkdir(sourceFile))
{
p_sMessage = "移动文件夹出错:文件夹" + p_sSourcePath + sourceFile + "向"
+ p_sTargetPath + sourceFile + "拷贝时失败";
return false;
}
}
//回调
this->CopyFolder(p_sUploadDate, p_sSourcePath + sourceFile + "/",
p_sTargetPath + sourceFile + "/", p_sMessage);
}
}
return true;
}