mikrocontroller.net

Forum: PC-Programmierung 7-zip Kommandozeile


Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: KoF (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ersetze mal deine "\\" durch /!!!

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat leider nichts gebracht!

Autor: Joline (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Christian Schifferle (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?).

Autor: Joline (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!!!!!!!!!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.