Использование 7-zip через system () в C ++ - PullRequest
1 голос
/ 09 февраля 2010

Я пытаюсь использовать 7-Zip для архивирования файла с помощью функции system() в C ++ на компьютере с Windows XP. Я попробовал:

(отформатировано так, чтобы система () получила)

"C:\Program Files\7-Zip\7z.exe" a -tzip "bleh.zip" "addedFile.txt"

который выплюнул ошибку

'C:\Program' is not recognized as an internal or external command, operable program or batch file.

Я пробовал несколько похожих вариантов, но пока не нашел решения.

Я хочу попробовать запустить его прямо из каталога установки, чтобы, пока у пользователя установлен 7-Zip, он мог функционировать. Это для внутреннего применения утилиты.

EDIT: по запросу это фактические строки кода:

std::string systemString = "\"C:\\Program Files\\7-Zip\\7z.exe\" a -tzip \"" + outDir + projectName + ".zip" + "\" \"";
//...
std::string finalSystemString = systemString + *i + "\"";
system( finalSystemString.c_str() );

*i - итератор для определенного файла, который добавляется.

Ответы [ 3 ]

4 голосов
/ 09 февраля 2010

похоже, что что-то разбирает кавычки вокруг первого аргумента. Вы можете поиграть с дополнительными кавычками, чтобы попытаться это исправить, или вы можете получить совместимый с MS-DOS короткий путь к 7z.exe с Win32 API GetShortPathName

Короткий путь не будет содержать пробелов, это будет что-то вроде "C: \ PROGRA ~ 1 \ 7-ZIP \ 7Z.EXE"

3 голосов
/ 09 февраля 2010

Вы пытались экранировать пробелы, то есть "C: \ Program \ Files \ 7-Zip \ 7z.exe"? Это может сработать, хотя я не знаю специфики system ().

0 голосов
/ 09 февраля 2010

Другой подход заключается в использовании функции CreateProcess в Windows API. Он может иметь дело с пробелами в "C: \ Program Files" в соответствии со своей документацией.

...