Forum: PC-Programmierung 7-zip Kommandozeile


von Markus (Gast)


Lesenswert?

Hallo,

ich möchte mit einem kleinen Programm 7-Zip starten und ein bestimmtes
Verzeichnis mit all seinen Unterverzeichnissen komprimieren.
Versuche es schon seit Tagen mit dem Befehl:
  CreateProcess(...,Kommandozeile,...)
Die Kommandozeile sieht so aus:
  c:\\> 7z.exe a -tzip "+base_archive_File+"  "+test+" -r

Kann mir bitte jemand sagen, wo der Fehler ist, bzw. wie ich es machen
muß.

Viele Grüße
Markus

von KoF (Gast)


Lesenswert?

ersetze mal deine "\\" durch /!!!

von Markus (Gast)


Lesenswert?

Hat leider nichts gebracht!

von Joline (Gast)


Lesenswert?

Du willst ein Kommandozeilentool mit einem selbst geschriebenen Programm
starten, richtig?

Da Du was von "c:\" schreibst, nehme ich an, Du willst das unter
Windoof laufen lassen.

Schau Dir mal die API-Funktion ShellExec an.

von Rufus T. Firefly (Gast)


Lesenswert?

Wenn CreateProcess fehlschlägt, dann wird das an den übergebenen
Parametern liegen.

Beschreib' doch mal, wie exakt Du CreateProcess aufrufst (und nenne
nicht nur einen der Parameter)

von Christian Schifferle (Gast)


Lesenswert?

STARTUPINFO             si;
PROCESS_INFORMATION     pi;

memset (&si, 0, sizeof (si));
si.cb = sizeof (si);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOWNORMAL;
if (CreateProcess (NULL,
     "c:\\> 7z.exe a -tzip \"+base_archive_File+\"
\"+test+\" -r",
     NULL,NULL,TRUE,0,NULL,NULL,&si,&pi)) {
   MessageBox (GetActiveWindow(),
          "Hat nicht geklappt", NULL, MB_ICONEXCLAMATION);
}


So müsste es eigentlich klappen.

Gruss
Christian

von Markus (Gast)


Lesenswert?

Hier ist mein Code:

AnsiString newZipFile, test, base_archive_File;

         test="TestDir\\*";
         base_archive_File="""7ziptest.zip""";
         newZipFile="c:\\> 7z.exe a -tzip "+base_archive_File+"
"+test+" -r";

         memset(&si, 0, sizeof(STARTUPINFO));
         si.cb = sizeof(STARTUPINFO);
         si.dwFlags = STARTF_USESHOWWINDOW |STARTF_USESTDHANDLES;
         si.wShowWindow = SW_SHOWNORMAL;

         if(!CreateProcess(ZipPath.c_str(),       //Prog.-.exe Pfad
                           newZipFile.c_str(),    //Argument
                           NULL,                  //Security
                           NULL,                  //Security
                           FALSE,                 //inherits handles
                           0,
                           NULL,
                           NULL,
                           &si,
                           &pi))
         {
           ShowMessage("Archivierung konnte nicht durchgeführt
werden.");
         }

es geht um das Verzeichnis TestDir(mit Unterverzeichnisse) auf c:

von Rufus T. Firefly (Gast)


Lesenswert?

Und? Was meinst Du, was CreateProcess aus dem folgenden String machen
soll?

"c:\\> 7z.exe a -tzip "+base_archive_File+" "+test+" -r";

CreateProcess versucht einen Prozess mit dem Namen c:\> zu starten.

Es gibt zwei Möglichkeiten, CreateProcess mitzuteilen, was es aufrufen
soll.
Die eine, die Du hier anwendest, nämlich alles in einem String, setzt
zwingend voraus, daß Exe-Dateiname und Argumente durch Leerzeichen
voneinander getrennt sind. Der erste Teilstring muss den Dateinamen der
Exe-Datei enthalten, entweder mit absolutem Pfad oder aber - wenn  der
in der Environmentvariablen "PATH" enthalten ist, ohne.

Alternativ kann der Exe-Dateiname nebst Pfad auch als separates
Argument übergeben werden, dann aber muss das zweite Argument nur noch
die Kommandozeilenargumente enthalten.

Unabhängig davon ist als ein weiteres Argument noch das
Arbeitsverzeichnis für den Prozess zu übergeben.


CreateProcess(NULL,
    "c:\\programme\\sevenzip\\7z.exe a -tzip 7ziptest.zip
c:\\TestDir\\* -r",
    NULL,
    NULL,
    FALSE,
    CREATE_NEW_CONSOLE | NORMAL_PRIORITY_CLASS,
    NULL,
    "c:\\temp",   // Arbeitsverzeichnis
    &SInfo,
    &PInfo);


CreateProcess("c:\\programme\\sevenzip\\7z.exe",
    "a -tzip 7ziptest.zip c:\\TestDir\\* -r",
    NULL,
    NULL,
    FALSE,
    CREATE_NEW_CONSOLE | NORMAL_PRIORITY_CLASS,
    NULL,
    "c:\\temp",   // Arbeitsverzeichnis
    &SInfo,
    &PInfo);


(hier jetzt mal angenommen, daß 7z.exe im Verzeichnis
c:\programme\sevenzip residiert)

Was sollen die vielen Anführungszeichen in Deinen Strings?

von Markus (Gast)


Lesenswert?

Die vielen Anführungszeichen kannst du vergessen, wollte nur etwas
ausprobieren.
Danke für die Mühen, aber es funktioniert mit diesen Befehlen immer
noch nicht. Bin langsam echt am verzweifeln.
Ich benutze von 7-Zip die Version 3.13! Ist bei der evtl. die
Kommandozeile etwas anderst?

von Rufus T. Firefly (Gast)


Lesenswert?

Ob die Kommandozeilenargumente von 7zip korrekt sind oder nicht, lässt
sich ja leicht durch Eintippen derselbigen in ein
Kommandozeilenfenster selbst ausprobieren.

"Es funktioniert immer noch nicht" ist eine urst präzise
Fehlerbeschreibung - wird 7zip nicht aufgerufen oder stimmen die - wie
erwähnt von Dir selbst überprüfbaren Kommandozeilenargumente nicht?

Welchen Installationspfad verwendest Du denn? Der von mir angegebene
ist natürlich aus der Luft gegriffen und muss nicht die Realitäten
Deines Rechners widerspiegeln (woher sollte ich die kennen?).

von Joline (Gast)


Lesenswert?

@Markus

>newZipFile="c:\\> 7z.exe a -tzip "+base_archive_File+"

Wenn das wirklich das Kommando sein soll, was da ausgeführt werden
soll, dann muss ich Rufus Recht geben. Damit wird "c:\>" ausgeführt
(mit Betonung auf >).

Beherzige einfach den Tip von Rufus:
>Ob die Kommandozeilenargumente von 7zip korrekt sind oder nicht,
>lässt sich ja leicht durch Eintippen derselbigen in ein
>Kommandozeilenfenster selbst ausprobieren.

Ich glaube, dass Dein Problem nicht mit der Funktion CreateProcess,
sondern eher mit der korrekten Ausführung des Kommandos in dem
Kommandozeilenfenster zu tun hat.

von Markus (Gast)


Lesenswert?

Ihr habt Recht gehabt!!!

Habe das Programm im DOS-Fenster aufgerufen und es hat auf Anhieb
geklappt. War also ein Fehler in der Kommandozeile.

Hier ist die Lösung:
"C:\Programme\7-Zip\7z a -rtzip testFile.zip TestDir\\* "

Vielen Dank für eure Mühen,bin noch ein Programmierneuling und deshalb
geht es bei mir noch nicht so schnell.

Nochmals Danke!!!!!!!!!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.