在Redhat上从c++解压文件:system()的替代方案
Unzipping a file from C++ on Redhat: alternatives to system()
我需要在运行c++程序时解压缩文件(在RedHat机器上运行c++代码之前等待解压缩完成)
要做到这一点,我现在这样做:
system("unzip /usr/bin/File/ZippedFile.gz -d /usr/bin/File/)
将"/usr/bin/File/ZippedFile.gz"解压缩到"/usr/bin/File/ZippedFile"没有问题。
这很好。然而,我注意到许多人似乎认为使用
system()
是禁忌。
人们似乎不喜欢它,因为安全性和系统资源(这里讨论:http://www.cplusplus.com/forum/articles/11153/)。
但是我想让程序等到解压缩完成,有没有可行的替代方案?
您可以使用普通的zlib
,或者boost::iostream
gzip工具。
系统本身不是错误的,但是您也可以为它编写一个不使用fork
, exec
, wait
和mkstemp
外壳的替换。不过这很麻烦。如果你解压缩单个文件,使用boost::gzip_decompressor
对我来说是最好的c++选项。如果您需要解压缩一个目录,那么使用fork和friends可能会更好。请务必阅读mkstemp
。
关于fork和exec家族的速成课程:http://www.yolinux.com/TUTORIALS/ForkExecProcesses.html
为您的孩子使用wait
终止的示例:http://support.sas.com/documentation/onlinedoc/sasc/doc/lr2/wait.htm
关于创建临时目录的参考:http://www.gnu.org/s/hello/manual/libc/Temporary-Files.html
是的,出于各种原因(安全性、可移植性等),这是一种糟糕的做法。你需要得到一个压缩库(谷歌搜索给我一个类似http://www.firstobject.com/easy-zlib-c++-xml-compression.htm的东西,甚至是用来构建"解压缩"的库,如果它是免费的,但必须有加载),然后使用它,如果你需要并行地做这两个,然后引入线程。我同意有一点工作,但在实践中这比使用system()调用要好。
- 运行同一解决方案的另一个项目的项目
- Project Euler问题4的错误解决方案
- 计算每个节点的树高,帮助我解释这个代码解决方案
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- visual c++,如何获取解决方案目录中的代码
- 如何在c++中使用system()来运行包含空格的python脚本
- System.InvalidCastException - SQL to C++ - safe_cast<float>
- 有没有办法在远程设备上打开和编辑visual Studio 2017解决方案
- C++Matching Brackets 2解决方案不起作用
- 在 ubuntu3 上C++ goto 定义有什么解决方案吗16.04?
- C++11 中不同类型的对象的 std::array 的替代方案
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- 我的固定时间步长与增量时间和插值的解决方案是错误的吗?
- 无法在问题解决方案中执行输出逻辑
- C++/CLI System.AccessViolation在托管类中调用非托管函数时出现异常
- 来自 Android 应用程序内部的 boost 类型的 boost::wrapexcept<boost::system::system_error> 的未捕获异常
- 最大的回文产品 - 程序未运行,编写解决方案但无法理解问题
- linux上的c++system()的替代方案
- 在Redhat上从c++解压文件:system()的替代方案