功能设计
1、实现文件拷贝函数
2、实现目录及子目录下所有文件的拷贝任务
3、文件/目录的删除
4、可获取拷贝进度
5、目标目录下同名文件进行比较,同一文件跳过,不同文件拷贝。
6、目标目录下多出的文件及目录自动删除
相关函数
void cp(QString src, QString dst);
例1:
cp("./test1", "./test2");
将test1(文件或目录)复制到 "/test2/test1",
若"/test2/test1"已存在,则会删除掉"/test2/test1"后再复制
void cpdiff(const QString src, const QString dst);
例2:
cpdiff("./test1", "./test2");
将test1(文件或目录)复制到 "/test2/test1"
若"/test2/test1"已存在,相同文件将略过。多余的文件会删除
void rm(const QString path, bool contain = true);
例3:
cpdiff("./test1");
删除./test1(目录或文件)
部分代码
void ContentsOperate::cp(QString src, QString dst)
{
QFileInfo srcInfo;
srcInfo.setFile(src);
// dstInfo.setFile(dst);
QDir srcDir(src);
QDir dstDir;
QFileInfoList fileInfos ;
if(srcInfo.isDir())
dstDir.setPath(dst+"/"+srcInfo.fileName());
else if(srcInfo.isFile()){
QFile::copy(src,dst+"/"+srcInfo.fileName());
return;
}
if(!dstDir.exists()){
// qout << "mkdir " << dstDir.absolutePath() << dstDir;
if(!dstDir.mkpath(dstDir.absolutePath())){
qout << "mkpath fail : " << dstDir.absolutePath();
return;
}
}
fileInfos = srcDir.entryInfoList(QDir::NoDotAndDotDot | QDir::AllEntries);
foreach (QFileInfo fileInfo, fileInfos) {
if (fileInfo.isFile()) {
QFile::copy(fileInfo.absoluteFilePath(), dstDir.absoluteFilePath(fileInfo.fileName()));
} else if (fileInfo.isDir()){
cp(fileInfo.filePath(),dstDir.absolutePath());
}
}
}
void ContentsOperate::cpdiff(const QString src, const QString dst)
{
QString srcPath,dstPath;
QFileInfo srcInfo,dstInfo;
QDir dstDir;
int progress = 0;
int fileCount = 0;
srcPath = src;
dstPath = dst;
while(srcPath.right(1)== "/"){
srcPath = srcPath.left(srcPath.size()-1);
}
while(dstPath.right(1)== "/"){
dstPath = dstPath.left(dstPath.size()-1);
}
srcInfo.setFile(srcPath);
// dstInfo.setFile(dstPath);
//目标目录不存在或 目标目录下不存在该目录则直接复制
// dstPath = ;
dstDir.setPath(dstPath + "/" + srcInfo.fileName());
if(!dstDir.exists()){
if(!dstDir.mkpath(dstDir.absolutePath())){
qout << "mkpath fail : " << dstDir.absolutePath();
return;
}
cp(srcPath, dstPath);
return ;
}
dstInfo.setFile(dstDir.absolutePath());
cpdiff(&srcInfo, &dstInfo);
}