一、tar.gz
以.tar.gz为后缀的文件是一种压缩文件,在Linux下常见。一般情况下都是源代码的安装包。它其实是先打包成tar格式的文件,然后利用gzip压缩技术来压缩。这两天我想在windows下去解压这种类型的压缩包,不是拿那种可视化的软件去操作,所以一直想着有什么开源的解压库,可以一次解压,但是没找到,最后使用windows命令行去执行,通过gzip.exe和7za.exe控制台程序去执行
二、原理
分两步走,先将file.tar.gz压缩包解压为file.tar,再将file.tar解压为file.
三、示例代码
//D:/pig.tar.gz -> D:/pig
bool FileOperator::extractTarGz(QString fileName, QString dstPath)
{
if(fileName.length()<8 || fileName.right(7)!=".tar.gz")
{
qDebug()<<"格式错误, 必须为'.tar.gz'";
return false;
}
if(dstPath.length() == 0)
{
qDebug()<<"解压目标路径为空";
return false;
}
int ret;
QProcess p;
qDebug()<<fileName<<" 解压到 "<<dstPath;
fileName.replace("/", "\\");
//exe程序路径
QString binPath = QApplication::applicationDirPath() + "/";
binPath.replace("/", "\\");
qDebug()<<binPath;
//1.使用Windows命令行(路径表示方法"\\"),gzip.exe、7za.exe
//解压gz格式
QStringList args;
args.append("-d");
args.append("-f");
args.append(fileName);
ret = p.execute(binPath + "gzip.exe", args);
if(ret != 0)
{
qDebug()<<"gzip 返回错误码:"<<ret;
return false;
}
qDebug()<<"file.tar.gz -> file.tar 成功!";
//压缩包文件名剥离".gz"
fileName = fileName.left(fileName.length()-3);
//解压tar格式
QStringList args1;
args1.append("x");
args1.append(fileName);
args1.append("-y");
dstPath.replace("/", "\\");
args1.append("-o" + dstPath);
p.execute(binPath + "7za.exe", args1);
if(ret != 0)
{
qDebug()<<"7za 返回错误码:"<<ret;
return false;
}
qDebug()<<"file.tar -> file 成功!";
QFile::remove(fileName);
return true;
}
四、上面的代码相当于在命令行中执行。
代码和命令行执行的效果是一样的,7za功能很强大,支持多种格式,使用它解压tar和gz格式都可以。
参考了:[hanzengyi]:windows 下调用gzip.exe 和tar.exe解压*.tar.gz压缩包到指定目录