在QT程序中需要将某些目录和文件压缩为一个rar的压缩包,于是想到了在QT中通过QProcess类调用命令行的rar.exe来达到效果,但是没想到QProcess类用起来很麻烦,而且达不到效果,折腾了2天仍然没找到原因,使用另外一种办法解决了。

创建压缩包的方法

在windows平台创建压缩包,可以直接使用rar.exe,该程序在安装winrar之后,在其安装目录下就可以找到。该程序是winrar对应的命令行版本,其语法例子如下:

rar.exe a -k -r -s -m1 test.rar direct1/   direct2/  test.txt

例子对应的目录结构如下:

上面的命令表示在当前目录下创建压缩包 test.rar ,将当前目录下的 direct1目录以及其所有子目录和文件、direct2目录以及其子目录和文件、当前目录下的文件test.txt 都添加到test.rar压缩包中。

其中参数a表示添加到压缩包

参数-r表示递归添加

命令的问题解决了之后,那么下面就是如何在QT中调用该命令,实际上在QT中调用该命令就出现了很多问题。

在QT中调用命令行

QT中调用外部命令一般使用QProcess类提供的成员函数,其使用的具体代码如下:

套用上面的代码得到如下:

可以生成test.rar但是,该压缩包中将路径E:/test_rar_course也压缩进去了,而我需要的是打开压缩包之后仅仅看到direct1,direct2,test.txt3个项目,那么是不是设置一下工作目录就可以了呢:

我不仅添加-w参数(该参数为rar.exe的命令行参数,用于指定工作目录)为rar.exe命令指定工作目录,同时利用p.setWorkingDirectory()为启动的进程指定工作目录,运行之后报错,说找不到文件,我猜可能还是工作目录的问题,但是不知道问题在哪里,查了很多资料都无济于事,最终还是放弃了这种尝试,改成了下面的尝试:

而test.bat的内容为如下:

我直接在bat中通过cd命令切换工作目录,然后进行压缩,其中为了避免出现压缩绝对路径的情况,direct1,direct2,test.txt使用的都是相对路径,直接鼠标双击该test.bat运行OK,放在QT中运行OK,似乎完美的解决了问题。

但是我发现,如果目录中出现()括号字符就不行了,当有括号字符的时候在QProcess执行的报错中显示路径被括号截断,此后我把路径用引号引起来没效果:

"\"E:/test_rar_course(xx)/test.bat\""

根据网上搜索到的信息,用^符号对括号进行转义没有截断的报错了,但是命令执行还是没有效果,控制台也没有报错:

"E:/test_rar_course^(xx^)/test.bat"

到这里我不知道该怎么样去达到我的效果,唯一的感觉QProcess怎么这么难用,如果有知道的QT大神,烦请告诉一下。我想到用另外一种方式来实现,就是用C++写一个dll实现,然后QT中调用。

在QT中调用C++创建的dll

主要代码如下,实际上就是调用system函数,但是如果路径中有圆括号,还是需要用^符号进行转义,否则system执行也有问题:

但是除了圆括号要转义以外,还存在一个很不舒服的问题,就是每次执行都会弹出cmd的黑窗口,执行完成之后,窗口消失,代码改成下面的就好了:

到此完美解决该问题,既不需要对圆括号进行转义,同时也隐藏了黑窗口了。当然前述的test.bat的内容要在程序中动态生成,利用合适的路径替换掉test.bat中的路径。

最后调用如:SystemTool::GenerateIndexRar("E:/test_rar_course(xx)/test.bat");

http://www.cnblogs.com/wangqiguo/p/4609228.html

qt执行命令行失败_QT中QProcess调用命令行的痛苦经历相关推荐

  1. QT中QProcess调用命令行的痛苦经历

    在QT程序中需要将某些目录和文件压缩为一个rar的压缩包,于是想到了在QT中通过QProcess类调用命令行的rar.exe来达到效果,但是没想到QProcess类用起来很麻烦,而且达不到效果,折腾了 ...

  2. idea打开linux命令行,在IDEA中使用Linux命令的操作方法

    相比于Windows系统,Linux系统提供了大量丰富的命令行工具,可以简单高效地进行工作.而大部分开发人员,都只知道Linux系统的命令,不太清楚Windows系统的命令,所以我们希望能够在Wind ...

  3. linux中sed命令用例,Linux中使用sed命令或awk命令修改常规配置文件

    一.方案: Linux中使用sed命令或awk命令修改常规配置文件 二.步骤: 1.假设有一个a.txt,内容如下: #!/bin/bash aa= bbb= ccc= #ddd= 2.如果想要把里面 ...

  4. linux tr 命令_在Linux中使用tr命令玩角色

    linux tr 命令 tr command in Linux translates one set of characters to another. It can replace a charac ...

  5. Linux中的ftp命令怎么写,linux中的ftp命令用法

    Linux系统中的ftp命令功能强大,那么它的具体用法是怎样呢?下面由学习啦小编为大家整理了linux中的ftp命令用法相关知识,希望对大家有帮助! linux中的ftp命令用法 1. 连接ftp服务 ...

  6. linux命令 mv -v,linux中的mv命令

    Linux系统中的mv令是一个常用的基本命令,它的主要功能是对文件或目录重命名,或者移除目录.下面由学习啦小编为大家整理了linux中的mv命令的相关知识,希望对大家有帮助! linux中的mv令详解 ...

  7. linux中more命令的意思,linux中的more命令的详细解释

    linxu下的more命令是干什么用的呢?下面由学习啦小编为大家整理了linux的more命令的详细解释的相关知识,希望对大家有帮助! 一.linux中的more命令的详细解释 Linux more ...

  8. linux中wc命令怎么退出,linux中的wc命令

    今天去图书馆还书,借的几本C++的书都没看几页,真惭愧~~不过也是,现在没什么用到C++,学习的动力自然不足,等以后吧,借了几本Linux的书,觉得系统还是很重要,大部分企业都是用Unix/Linux ...

  9. linux中umount命令的功能,Linux中的umount命令的详细解释

    Linux下的umount命令的主要功能就是用来卸除文件系统,下面由学习啦小编为大家整理了linux下的umount命令的详细解释,希望对大家有帮助! Linux中的umount命令的详细解释 Lin ...

最新文章

  1. Hibernate Tomcat JNDI数据源配置(转)
  2. Cisco无线AP上联口为trunk时无法注册故障处理
  3. 语音交互有哪些优势与劣势?
  4. 一个抓取豆瓣图书的开源爬虫的详细步骤
  5. Python编写编程作业批量自动打分程序的思路与实现
  6. redhat 7 oracle 11,redhat7 搭建oracle 11g RAC 问题与处理
  7. 数据结构与算法 —— 向量的扩容策略与分摊时间复杂度
  8. Take it easy
  9. html转pdf分页问题终极解决方案 k-htmlpdf
  10. vi打开GBK编码文件乱码问题
  11. 科创板第二批受理名单公布,为何AI独角兽 “全军覆没”?
  12. iphone型号表_iPhone12各版本有什么区别 苹果12四款机型配置表一览
  13. 平淡人生(一)- 360发展历程及人物杂记
  14. 更换新电池对iPhone手机性能的影响实测
  15. 面向医疗数据的差分隐私保护
  16. LightWave 3D 2019 for Mac(三维动画制作软件)
  17. 【Python】《Python语言程序设计》(嵩天 、黄天羽 、礼欣)测验单项选择题答案与解析合辑
  18. JIRA 的中文设置
  19. 大数据展示IT需求模板
  20. 阿里云二级域名解析到指定端口号的一种方法

热门文章

  1. 荣耀折叠屏手机发布日期曝光?将主打年轻用户
  2. 支付宝五福又来了,但已没人关心抢红包
  3. 《运营之光》-- 学习笔记(二)
  4. fast start oracle,Oracle Data Guard快速启动故障切换 - fast-start failover(FSFO)
  5. raiserror 在 java_SQL 抛出异常错误信息- RAISERROR (存储过程)
  6. html canvas toblob 和下载图片
  7. c++自由读写配置ifstream(一)
  8. set python用法_Python set()用法及代码示例
  9. FTP学习的一些笔记
  10. 添加lua_非关系型数据库Redis之Lua脚本