Seite 1 von 1

Command String Probleme mit 7zip (Gelöst)

Verfasst: 22.08.2013 12:39
von walbus
Könntet ihr mir hier bitte aushelfen,
ich krieg den String (hier im Code ist er zum erstellen) nicht umgestellt zum auslesen eines Archiv´s,
mit der Kommanodzeilen Version von 7zip.
Klappt einfach nicht !

Gruss Werner

Code: Alles auswählen

;Modified version of Oryaaa's 7zip code - http://www.purebasic.fr/english/viewtopic.php?p=181484#181484

DataSection
zip:
IncludeBinary "7za.exe"
zip_e:
EndDataSection

Procedure.b SevenZip_Archive(archive.s, target.s, compression.b=9)
  Protected file.l , param.s , zip_Run.l , runfile.s
  
  ;Check if archive path is a folder
  directory$ = GetPathPart(archive)
  ExamineDirectory(0, directory$, "*.*")
  
  If Not IsDirectory(0)
    MakeSureDirectoryPathExists_(@directory$)
     ;CreateDir(directory$)
  EndIf
  
  param.s = "a -mx=" + Str(Compression) + " " + Chr(34) + archive + Chr(34) + " " + Chr(34) +target+ Chr(34)

  runfile.s = GetTemporaryDirectory() + Str(Date()) + "\7za.exe"
  CreateDirectory(GetPathPart(runfile))
  file.l = CreateFile(#PB_Any, runfile)
  
  If file
    WriteData(file, ?zip, ?zip_e-?zip)
    CloseFile(file)
    workingdir$=GetPathPart(Archive)
    zip_Run = RunProgram(runfile, param,workingdir$, #PB_Program_Open|#PB_Program_Hide)
    While ProgramRunning(zip_Run)
      Delay(10)
    Wend
    Debug ProgramExitCode(zip_Run) ; Fehlermeldung : 0=OK - 1=unvollständig - 2=Fatal - 7=Command line error - 8 zu wenig Memory - 255=User stoppt Prozess
    CloseProgram(zip_Run)
    
    Repeat
       Result = DeleteDirectory(GetPathPart(runfile),"")
    Until Result <> 0
    
    ProcedureReturn #True 
  Else
    ProcedureReturn #False
  EndIf
EndProcedure

quell_dateipfad$="C:\Dokumente und Einstellungen\"+GetEnvironmentVariable("USERNAME")+"\desktop\"+"test" ; Dateipfad zum Desktop

Debug SevenZip_Archive(quell_dateipfad$+".zip",quell_dateipfad$,9)


Re: Suche Command String zum Ordner auslesen 7zip

Verfasst: 22.08.2013 12:52
von Kiffi
da Dein quell_dateipfad$ Leerzeichen beeinhaltet, solltest Du ihn in doppelte Anführungszeichen (CHR(34)) setzen.

Grüße ... Kiffi

Re: Suche Command String zum Ordner auslesen 7zip

Verfasst: 22.08.2013 12:58
von walbus
Ja, danke, dies ist der String zum schreiben, er funktioniert.
Ich bräuchte einen zum lesen !
Krieg es nicht gebacken ihn umzustellen, hab schon alles mögliche probiert, immer Fehlermeldung

Gruß Werner

Re: Suche Command String zum Ordner auslesen 7zip

Verfasst: 22.08.2013 13:51
von _JON_
Meist Du jetzt auslesen oder entpacken?

Ersteres wäre: 7za l "Archive.7z"
Entpacken : 7za e "Archive.7z" "Ziel"

Re: Suche Command String zum Ordner auslesen 7zip

Verfasst: 22.08.2013 13:57
von walbus
Hallo
Entpacken eines bestehenden Archives

Einen funktionierenden Command String um Archive mit der Kommandozeilen Version von 7zip , daher im Hintergrund, zu entpacken.

Danke für die Mühe

Gruss Werner

Re: Suche Command String zum Ordner auslesen 7zip

Verfasst: 22.08.2013 14:47
von bobobo
angelehnt an deinen Code sollte das so gehen

der commandstring ist x -o"zielverzeichnis" "zipdateiname" ..wichtig kein Space hinter dem -o

Ich mach sowas gerne über Batchdateien. Die baue ich zusammen und rufe die dann hidden auf.
Das u.a. hat den Vorteil der besseren Fehleranalyse.
Dieses Programmoutputding muss nämlich nicht immer zum Erfolg führen, je nach aufgerufener
Exe-Datei. 7za geht aber so durchaus.

Ich habe hier eine etwas andere Herangehensweise zur Ermittlung des DesktopOrdners gewählt

Code: Alles auswählen

;Modified version of Oryaaa's 7zip code - http://www.purebasic.fr/english/viewtopic.php?p=181484#181484

DataSection
zip:
IncludeBinary "7za.exe"
zip_e:
EndDataSection

Procedure.b SevenZip_Archive(archive.s, target.s, compression.b=9)
  Protected file.l , param.s , zip_Run.l , runfile.s
  
  ;Check if archive path is a folder
  directory$ = GetPathPart(archive)
  ExamineDirectory(0, directory$, "*.*")
  
  If Not IsDirectory(0)
    MakeSureDirectoryPathExists_(@directory$)
     ;CreateDir(directory$)
  EndIf
  
    param.s = "x -o" +  Chr(34) +target+ Chr(34)+ Chr(34) + archive + Chr(34) ;wichtig !! kein Space hinter dem -o

  runfile.s = GetTemporaryDirectory() + Str(Date()) + "\7za.exe"
  CreateDirectory(GetPathPart(runfile))
  file.l = CreateFile(#PB_Any, runfile)
  
  If file
    WriteData(file, ?zip, ?zip_e-?zip)
    CloseFile(file)
    workingdir$=GetPathPart(Archive)
    zip_Run = RunProgram(runfile, param,workingdir$, #PB_Program_Open)
    While ProgramRunning(zip_Run)
      
      While AvailableProgramOutput(zip_Run)
        Debug ReadProgramString(zip_Run)
      Wend
      
    Wend
    Debug ProgramExitCode(zip_Run) ; Fehlermeldung : 0=OK - 1=unvollständig - 2=Fatal - 7=Command line error - 8 zu wenig Memory - 255=User stoppt Prozess
    CloseProgram(zip_Run)
    
    Repeat
       Result = DeleteDirectory(GetPathPart(runfile),"")
    Until Result <> 0
    
    ProcedureReturn #True 
  Else
    ProcedureReturn #False
  EndIf
EndProcedure

quell_dateipfad$=GetHomeDirectory()+"\desktop" ; Dateipfad zum Desktop
Debug quell_dateipfad$+".zip"
Debug quell_dateipfad$

Debug SevenZip_Archive(quell_dateipfad$+".zip",quell_dateipfad$,9)

Re: Suche Command String zum Archiv auslesen mit 7zip

Verfasst: 22.08.2013 15:13
von walbus
Bringt leider immer noch Fehlermeldung.
Mit der Batch, ein guter Tip !

Gruss Werner

Re: Suche Command String zum Archiv auslesen mit 7zip

Verfasst: 22.08.2013 16:13
von Kiffi
walbus hat geschrieben:[...] immer noch Fehlermeldung.
... die da lautet?

Grüße ... Kiffi

Re: Suche Command String zum Archiv auslesen mit 7zip (gelös

Verfasst: 22.08.2013 16:29
von walbus
7=Command line error

Der Vorschlag von ´bobobo´ mit den Batch Dateien ist die Lösung.
Dann funktionieren auch die Command Strings so wie sie sollen !

Hier etwas Code.
Er nutzt den Trick, den ´Kiffi´ mal postete, mit den einfachen Hochkomma´s um die Strings einfach erstellen zu können, ohne dass man die Kriese kriegt mit dem Gefummel.

Code: Alles auswählen

Procedure create_batch(source$,target$,command$)
  
     Protected result

     result= CreateFile (0, GetTemporaryDirectory()+"quickaes256.bat") ; Batch Datei in Temp Ordner erzeugen
  
  If result
 
    ; Falls Leerzeichen im Pfadnamen sind, muß dieser mit doppelten Anführungszeichen eingefaßt sein
    ; 7za ist die stand alone Version von 7zip
    ; 7a ist Bestandteil der Desktop Version
    ; Command String durch einfache Hochkomma lesbarer machen 

      command$=ReplaceString(command$, "''",Chr(34))

      WriteString (0, command$)
  
      Debug command$
  
      CloseFile (0) ; schließen der zuvor geöffneten Datei und damit endgültiges Abspeichern der Daten
    Else
      MessageRequester (" Information "," Konnte Datei nicht erstellen !")
  EndIf
    
    ProcedureReturn result
 
  EndProcedure
  
  ;-----------------------------------------------------------------------
  
  quell_dateipfad$=GetHomeDirectory()+"desktop"

  source$=quell_dateipfad$+"\"+"test.7z"
  
  target$=quell_dateipfad$+"\"+"test\*.*"

; ------- Ein paar beliebig erweiterbare Beispiele ---------
  
 ; command$="7za a -t7z ''''"+source$+"'''' ''''"+target$+"''''" ; Archiv packen
 ; -------
 ; 7z x test.zip -aoa
   command$="7za e ''''"+source$+"''''"+" -aoa" ; Archiv auspacken
 ;--------
   ;target$=quell_dateipfad$+"\"+"test" ; Archiv auspacken
  ; command$="7za x ''''"+source$+"''''"+" -o''''"+target$+"''''" ; Archiv auspacken
 ;-------
 ; zB. Packen    : 7za l "Archive.7z"
 ; zB. Entpacken : 7za e "Archive.7z" "Ziel"
;--------

  Debug source$
  Debug target$
  
  Debug create_batch(source$, target$, command$)
Gruss Werner