Распаковка файла из C ++ в Redhat: альтернативы system () - PullRequest
1 голос
/ 11 августа 2011

Мне нужно распаковать файл во время работы программы на C ++ (как описано в Ожидание завершения распаковки перед продолжением выполнения кода C ++ на компьютере RedHat )

Для этого я сейчас делаю что-то вроде этого:

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/).

Но так как я хочу, чтобы программа ожидала, пока распаковка не будет завершена, есть ли жизнеспособная альтернатива?

Ответы [ 2 ]

4 голосов
/ 11 августа 2011

Вы можете использовать обычный zlib или boost::iostream gzip .

Система не ошибается как таковая , но вы также можете написать замену, которая не использует оболочку с fork, exec, wait и mkstemp. Это громоздко, хотя. Использование boost::gzip_decompressor - лучший вариант C ++, если вы распаковываете отдельные файлы. Форкинг и друзья могут быть лучше, если вам нужно распаковать каталог. Обязательно прочитайте о 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

0 голосов
/ 11 августа 2011

Да, это плохая практика по разным причинам (безопасность, переносимость и т. Д.). Вам нужно получить zip-библиотеку (поиск в Google даст мне что-то вроде http://www.firstobject.com/easy-zlib-c++-xml-compression.htm или даже библиотеку, использованную для сборки 'unzip', если она бесплатна, но там должно быть множество загрузок), а затем использовать ее, и если вы нужно сделать оба параллельно, затем ввести потоки. Немного работы, я согласен, но на практике это лучше, чем использование вызова system ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...