引言

QProcess 是 Qt 框架提供的类,用于启动和控制外部程序。它允许通过异步或同步方式与子进程交互,支持读取/写入标准输入、输出及错误流,并监控进程状态。
tar 是 Unix/Linux 系统中用于归档文件的命令行工具,支持压缩与解压操作。解压时可能需要sudo权限,尽量避免使用绝对路径压缩。

一、QProcess调用tar命令压缩文件

	QProcess process;
    process.setProcessChannelMode(QProcess::MergedChannels);
    QFileInfo fileInfo(path);
    QString tar_cmd = QString("tar -czf xx.tar.gz -C %2 %3").
                      arg(fileInfo.absolutePath()).arg(fileInfo.fileName());
    process.start(tar_cmd);
    if(!process.waitForStarted()){
        qDebug() << process.errorString();
    }
    if(!process.waitForFinished(5000)){
        qDebug() << QString("process time out: %1").arg(tar_cmd);
    }
    qDebug() << process.readAll();

二、遇到的问题及解决方案

2.1 警告:Removing leading `/’ from member names…

  • 产生原因:该警告信息是tar命令在压缩绝对路径文件时的常见提示,表示自动移除了路径开头的斜杠

tar: Removing leading `//‘ from member names:https://www.cnblogs.com/shenweiyan/p/17449435.html
Linux压缩多个文件出现“removing leading / from member name”:https://zhuanlan.zhihu.com/p/26111416612

  • 解决方案:
  • 1. 在命令中添加-P(大写)参数,明确允许保留绝对路径tar -czPf
  • 2. 避免使用绝对路径,先进入文件所在目录再执行压缩cd /home/xxx && tar -czvf xxx

2.2 压缩包中将路径也压缩进去了,解压缩之后需打开很多文件夹才能看到压缩的文件

  • 产生原因:命令行中被压缩的文件使用了绝对路径 (/path1/path2/filename)

QT中QProcess调用命令行的痛苦经历:https://www.cnblogs.com/wangqiguo/p/4609228.html
在Linux中使用tar命令打包绝对路径的问题:https://blog.csdn.net/qq_44895681/article/details/123378183
tar 压缩使用绝对路径时解压会出现多级文件夹:https://blog.csdn.net/holly_Z_P_F/article/details/142589724

  • 解决方案:
  • 1. 在命令中添加-C(大写)参数tar -czf xxx.tar.gz -C /path1/path2 filename
  • 2. 避免使用绝对路径,先进入文件所在目录再执行压缩cd /home/xxx && tar -czvf xxx

三、其他解决方案

  1. C++写一个dll实现,然后QT中调用
    参考链接:QT中QProcess调用命令行的痛苦经历:https://www.cnblogs.com/wangqiguo/p/4609228.html
  2. 使用高版本Qt,调用自带的Qzipwriter对文件进行压缩
    参考链接:Qzipwriter+QzipreaderQt自带压缩解压缩:https://blog.csdn.net/gitblog_06707/article/details/148276820
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐