2010-02-09 23 views
1

J'essaie d'utiliser 7-Zip pour compresser un fichier via la fonction system() en C++ sur une machine Windows XP. J'ai essayé:Utilisation de 7-zip via system() en C++

(formaté pour être ce système() aurait reçu)

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

qui a craché l'erreur

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

J'ai essayé plusieurs solutions de rechange similaires, mais n'ont pas encore trouvé de solution.

Je veux essayer de l'exécuter directement à partir de son répertoire d'installation afin que tant que l'utilisateur a 7-Zip installé, il pourra fonctionner. Ceci est pour une application utilitaire interne.

EDIT: comme demandé ce sont les lignes réelles de code:

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 est un itérateur à un fichier particulier qui s'ajouté.

+0

S'il vous plaît signaler la ligne de code qui appelle le système, cette ligne de code est vraiment important pour répondre à cette question. – SoapBox

Répondre

4

Il semble que quelque chose supprime les guillemets autour du premier argument. Vous pouvez jouer avec des citations supplémentaires pour essayer de résoudre ce problème, ou vous pouvez obtenir le nom de chemin d'accès court compatible MS-DOS pour 7z.exe avec l'API Win32 GetShortPathName

Le chemin d'accès court n'aura pas d'espaces, il sera être quelque chose comme "C: \ PROGRA ~ 1 \ 7-ZIP \ 7Z.EXE"

+0

Cela pourrait être une meilleure solution qu'échapper comme je l'ai suggéré, juste parce que les doubles barres obliques sont Le code pourrait être plus clair en utilisant la fonction de raccourci – Ibrahim

+0

J'ai collé cela directement dans mon application et cela a fonctionné! Merci! Grand truc à savoir! – 0xC0DEFACE

3

Avez-vous essayé d'échapper les espaces, c'est-à-dire "C: \ Program \ Files \ 7-Zip \ 7z.exe"? Cela pourrait fonctionner, même si je ne connais pas les détails de system().

+0

+1, me battre au coup de poing. –

+0

Même résultat, cependant qui a causé MSVS pour lancer ceci: avertissement C4129: '': séquence d'échappement de caractères non reconnus :( – 0xC0DEFACE

+2

@ 0xC0DEFACE: Essayez "C: \\ Program \\ Files \\ 7-Zip \\ 7z.exe" –

0

Une autre approche serait d'utiliser la fonction CreateProcess dans l'API Windows. Il peut traiter des espaces dans "C: \ Program Files" selon sa documentation.