robo7z

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

robo7z

Beitrag von GPI »

Vielleicht kennt einer "Robocopy" - ein kleines Tool, das mit Windows mitgeliefert wird. Ziel ist es, ein Verzeichnis 1:1 auf ein anderes zu kopieren. Als Besonderheit kann robocopy Dateien, die in der Quelle gelöscht wurden, auch im Ziel löschen. Auch ist das Tool so intelligent, das es nur neue Dateien kopiert (wird anhand der Dateigröße und Datum erkannt).

Ich wollte für meine Backuplösung was ähnliches, nur braucht eine 1:1 Kopie sehr viel Platz, gezippt wäre schön und am besten noch ein Passwort setzen.

So entstand dann robo7z :) - es geht ein Verzeichnis nach dem anderen von der Quelle durch und "7z" jede Datei in eine eigene 7z-Datei. Allerdings kann ich so leider nicht mehr überprüfen, ob die Größe sich geändert hat, sondern es wertet nur noch den Datum/Zeiteintrag der Datei aus. Da Windows standardmäßig immer die Modfied-Date ändert, ist das kein so großes Problem.

Zum funktionieren braucht das Programm eine 7-zip32.dll, findet man hier http://www.csdinc.co.jp/archiver/lib/7-zip32.html (hier übersetzt: http://translate.google.de/translate?hl ... zip32.html), ganz unten 7z920002.zip downloaden. Weiter unten findet man eine englische Übersetzung der Api (auch wenn etwas veraltet).

Das Programm nutzt eine Reihe von Parametern:
<inpath> <outpath> [-pPassword] [-w] [-c] [-s] [-f<size>] [-eExcludeWildcard] [-bPath [-bPath]]

die ersten zwei Parameter sind fest. Man muss den Ursprungspfad und den Zielpfad angeben! Achtung das Ziel wird gnadenlos überschrieben! Das heißt, alle Dateien, die da drin sind (auch Unterordner) werden gelöscht!

-pPassword - setzt ein Passwort. Ohne Leerzeichen eingeben. Bspw. -phgze718
-w - schaltet ein paar Gags wegen Webdav ein (ein Protokoll, damit greif ich auf meine 15GB Smartdrive von meinen 1&1-DSL-Vertrag drauf zu.) Das mag nämlich nicht, wenn ein %-Zeichen in Namen vorkommt.
-c Check - nach den Schreiben wird das Archiv überprüft. Dabei wird nicht überprüft, ob die gepackte Datei mit der Quelle identisch ist, sondern ob das Archiv in Ordnung ist (Checksumme richtig, etc.) Achtung. Wenn der Zielpfad irgendwo in Internet ist, dann wird die Datei logischweise erst einmal wieder gedownloaded!
-s Subdirectory - es werden alle unterordner mit kopiert. Dazu wird auf den Ziel entsprechend die Ordner erstellt. Gezippt werden weiterhin nur die einzelnen Dateien.
-s<size> Was ich auch festgestellt hab, das es Probleme gibt, wenn die Dateinamen zu lang werden. Wenn die Dateinamengröße zu lang wird, kann man ein bischen Tricksen. Es wird für die Zipdatei ein verkürzter Name hergenommen (entspricht den windows-8.3-Dateinamen). Die Datei in der Zip behält ihren langen Namen. Wenn man den User-Ordner sichert, kann sowas schnell passieren.
-eWildcard Damit kann man Dateien ausschließen. Der Parameter ist nur einmal erlaubt! Man kann aber mehrere einträge hintereinander mit einen ; trenne. z.b. -*.bak;*.tmp;*cache*;logfile.log
-bPath schließt dateipfade aus. In Gegensatz zu -e muss man hier jeden Pfad einzeln angeben. -b darf also mehrmals vorkommen. z.b. -bc:\windows\temp -b*cache*

ein paar Beispiele:

Code: Alles auswählen

robo7z "C:\Users" "Y:\Backup\user" -c -s -w -f80 -eUsrClass.dat;ntuser.dat*;*.log*;SyncToy_*.dat;*.bak;*.tmp -pNeugierig -b*cache* -b*temp* -b*log* -b*Thumbs* -b*download* -b*\Windows\WER\ReportArchive -bC:\Users\GPI\Desktop "-bC:\Users\All Users\Microsoft\Crypto" "-bC:\Users\GPI\AppData\Local\Microsoft\Windows\history\" "-bC:\Users\All Users\Microsoft\WINDOWS\DRM" "-bC:\Users\GPI\AppData\Roaming\Apple Computer\iTunes\iPod Software Updates" "-bC:\Users\GPI\AppData\Roaming\Apple Computer\MobileSync\Backup" "-bC:\Users\GPI\AppData\Roaming\TV-Browser\tvdata"
Damit sichere ich meinen User-Ordner auf mein Smart-Drive-Laufwerk. Dabei schließe ich ein paar dateien aus, logfiles, backup etc. Genauso alle Cache-Order, Temp-Ordner, Log-Ordner, den Download-Ordner, Fehlerberichte, desktop, Itunes-Ordner usw.

Code: Alles auswählen

robo7z "D:\Eigene Dateien" "Y:\Backup\Eigene Dateien" -c -s -w -f80 -e*.log;SyncToy_*.dat -pNeugierig "-bD:\Eigene Dateien\!noSync\" "-bD:\Eigene Dateien\Eigene Videos\" "-bD:\Eigene Dateien\Musik\iTunes" "-bD:\Eigene Dateien\Musik\OverClocked ReMix OCR01001 to OCR01700"
Hier für meine eigenen Dateien (sind bei mir nicht in User-Ordner).

Mein Dank geht übrigens an ts-soft ( http://www.purebasic.fr/english/viewtopic.php?t=26429 ).

p.s. Kleiner Tip zur DLL. Wenn man eine datei "-test.txt" packen will - das minus am Anfang bewirkt, das es als Parameter angesehen wird , also macht ein "./-test.txt" draus, dann gehts. Zweiter Tip: "-hide" als Parameter versteckt das "Compress"-Fenster! Ansonsten benutzt die DLL die gleiche Syntax wie 7z.



So der Programcode:

Code: Alles auswählen

;XIncludeFile("7-zip32_include.pbi")

dll7zip=OpenLibrary(#PB_Any, "7-zip32.dll")
If dll7zip
  Prototype.l ProtoSevenZip(hWnd.l, szCmdLine.l, stOutput.l, dwSize.l = 0)
  Global SevenZip.ProtoSevenzip = GetFunction(dll7zip, "SevenZip")
  
  Prototype.l ProtoSevenZipCheckArchive(szFileName.p-ascii, iMode.l = 0)
  Global SevenZipCheckArchive.ProtoSevenZipCheckArchive = GetFunction(dll7zip, "SevenZipCheckArchive")
  
  ;Prototype.l ProtoSevenZipGetBackGroundMode()
  ;Global SevenZipGetBackGroundMode.ProtoSevenZipGetBackGroundMode = GetFunction(dll7zip, "SevenZipGetBackGroundMode")
  
  ;Prototype.l ProtoSevenZipSetBackGroundMode(BackGroundMode.l)
  ;Global SevenZipSetBackGroundMode.ProtoSevenZipSetBackGroundMode = GetFunction(dll7zip, "SevenZipSetBackGroundMode")
  
  
Else
  MessageRequester("Robo7z","Missing 7-zip32.dll")
  Debug "FEHLER!"
  End
EndIf


#deletefile=#PB_DirectoryEntry_Directory+#PB_DirectoryEntry_File+1


Global password$,exclude$,docheck,DoSub,WebPercent,shortname=0
Global Stat_new,Stat_NewFolder,Stat_Same,Stat_Update,Stat_Del,Stat_DelFolder

Global NewList blacklist.s()



Procedure.s NameCut(a$,b$)
  If Len(a$+b$)>80
    d=80-Len(b$)-5
    
    If D>60:d=55:ElseIf d<10:d=10:EndIf
    
    a$=Left(a$,d)+" ... "
  EndIf
  ProcedureReturn a$+b$
EndProcedure
Procedure quickadd(List l.s(),a$)
  AddElement(l())
  l()=a$
EndProcedure
Procedure.s EndSlash(a$)
  If Right(a$,1)<>"\"
    a$+"\"
  EndIf
  ProcedureReturn a$
EndProcedure


Global tempdir$


Procedure.s GetShortName(a$)
  c$=Space(#MAX_PATH+1)
  GetShortPathName_(@a$,@c$,#MAX_PATH)
  If WebPercent
    c$=ReplaceString(c$,"%"," ")
  EndIf
  ;c$=ReplaceString(c$,"-","  _");zip mit minus geht nicht.
  
  ProcedureReturn c$
EndProcedure

Procedure PrintNN(a$)
  gStdOut.l = GetStdHandle_(#STD_OUTPUT_HANDLE) 
  ;gStdIn.l = GetStdHandle_(#STD_INPUT_HANDLE) 
  consoleInfo.CONSOLE_SCREEN_BUFFER_INFO 
  GetConsoleScreenBufferInfo_(gStdOut, @consoleInfo) 
  x = consoleInfo\dwCursorPosition\x 
  y = consoleInfo\dwCursorPosition\y 
  Print(LSet(a$,80))
  ConsoleLocate(x,y)
  ;Delay(1000)
EndProcedure
Procedure PrintM(a$)
  While Len(a$)>80
    PrintN(Left(a$,80))
    a$=Right(a$,Len(a$)-80)
  Wend
  PrintN(LSet(a$,80))
EndProcedure

Global NewList ErrorTxT.s()
Procedure AddIfError(a$,flag)
  If flag=#False
    Debug a$
    printM(a$)
    AddElement(ErrorTxT())
    ErrorTxT()=a$
  EndIf
EndProcedure


Procedure findBlack(a$)
  ret=#False
  a$=EndSlash(UCase(a$))
  ForEach blacklist()
    If PathMatchSpec_(a$,blacklist())
      ret=#True
      Break
    EndIf
  Next
  ProcedureReturn ret
EndProcedure


Structure List
  left$
  leftShort$
  dateLeft.l
  typ.l
  right$
  dateRight.l
EndStructure


Procedure compress(in$,out$,file$,short$,date)
  ret=#False
  file2$=file$
  If WebPercent
    If FindString(file$,"%")  Or FindString(file$,"@")
      file2$=short$
      Debug "pro:"+file2$+"  von  "+file$
    EndIf
  EndIf
  If Len(file2$)>shortname And shortname>0
    file2$=short$
    Debug "SHORT:"+file2$+"  von  "+file$
  EndIf
    
  ak$=GetCurrentDirectory()
  SetCurrentDirectory(in$)
  
  cmd$="a "+Chr(34)+tempdir$+file2$+".7z"+Chr(34)+" "+Chr(34)+".\"+file$+Chr(34)+" -t7z -bd -hide -mx9"+password$
  If SevenZip(0, @CMD$, 0,0)=0 
    ret=#True
  Else
    DeleteFile(tempdir$+file2$+".7z")
    Debug "Fallback copy"
    a=CopyFile(file$,tempdir$+file$)
    
    SetCurrentDirectory(tempdir$)
    cmd$="a "+Chr(34)+".\"+file2$+".7z"+Chr(34)+" "+Chr(34)+".\"+file$+Chr(34)+" -t7z -bd -hide -mx9"+password$
    
    If SevenZip(0, @CMD$, 0,0)=0 
      ret=#True
    Else
      Debug "Fallback Shortname"
      file2$=short$
      cmd$="a "+Chr(34)+".\"+file2$+".7z"+Chr(34)+" "+Chr(34)+".\"+file$+Chr(34)+" -t7z -bd -hide -mx9"+password$
      If SevenZip(0, @CMD$, 0,0)=0 
        ret=#True
      EndIf
      Debug buffer$
    EndIf

    DeleteFile(file$)
  EndIf
  If ret
    SetCurrentDirectory(out$)
    a=CopyFile(tempdir$+file2$+".7z",file2$+".7z")   
    
  
    SetFileDate(file2$+".7z",#PB_Date_Modified,date)
  
    If docheck
      ret=SevenZipCheckArchive(file2$+".7z", 0)
      Debug "check:"+Str(ret)
      If date<>GetFileDate(file2$+".7z",#PB_Date_Modified)
        Debug "dateError"
        ret=#False
      EndIf
    EndIf
  EndIf
  DeleteFile(tempdir$+file2$+".7z")
  SetCurrentDirectory(ak$)
  ProcedureReturn ret  
EndProcedure

Procedure findleft(List files.List(),left$,typ)
  ret=#False
  left$=UCase(left$)
  ForEach files()
    
    If (UCase(files()\left$)=left$ Or UCase(files()\leftShort$)=left$) And files()\typ=typ
      ret=#True
      Break
    EndIf
  Next

  ProcedureReturn ret
EndProcedure




Procedure dodir(in$,out$)
   
  
  If findblack(in$)
    ;Debug "<--- black: "+in$+" --->"
    ;PrintN("Blacklist "+in$)
    ProcedureReturn #False
  EndIf
  ;PrintNN("Scan "+in$)
  a$=Left(in$,Len(in$)-1)
  ;Debug in$
  printnn(NameCut("Scan "+GetPathPart(a$),GetFilePart(a$)))
  
  ;Debug "--->"+in$+" * "+out$
  NewList Files.List()
  
  ;Quelle lesen
  dir=ExamineDirectory(#PB_Any,in$,"*.*")
  If dir
    While NextDirectoryEntry(dir)
      ;Select DirectoryEntryType(dir)
      ;  Case #PB_DirectoryEntry_File
      type=DirectoryEntryType(dir)
      name$=DirectoryEntryName(dir)
      
      do=#True
      If exclude$<>""
        If type=#PB_DirectoryEntry_File And PathMatchSpec_(name$,exclude$)=#True
          ;Debug "exclude:"+name$
          do=#False
        EndIf
      EndIf
      If type=#PB_DirectoryEntry_Directory And (name$="." Or name$="..")
        ;Debug "dir . oder .."
        do=#False
      EndIf
      If findblack(in$+name$)
        ;Debug "Blacklist"
        do=#False
      EndIf
      
      If do
        AddElement(files())
        files()\left$=name$
        files()\leftShort$=GetFilePart(GetShortName(in$+name$))
        files()\dateLeft=DirectoryEntryDate(dir,#PB_Date_Modified)
        files()\typ=Type
      EndIf
      ;EndSelect
    Wend
    FinishDirectory(dir)
  EndIf
  
  ;Ziel lesen
  dir=ExamineDirectory(#PB_Any,out$,"*.*")
  If dir
    While NextDirectoryEntry(dir)
      
      type=DirectoryEntryType(dir)
      name$=DirectoryEntryName(dir)
      If type=#PB_DirectoryEntry_File
        If UCase(Right(name$,3))=".7Z"
          If DirectoryEntrySize(dir)=0   
            ;es liegt wohl ein Fehler vor!
            ;Die Datei wohl besser löschen.
            AddElement(files())
            files()\typ=#deletefile
            files()\right$=name$
          Else          
            name$=Left(name$,Len(name$)-3)
            If findleft(files(),name$,type)=#False
              AddElement(files())
              files()\typ=type
              Debug "FEHLT:"+name$
            EndIf
            files()\right$=name$
            files()\dateRight=DirectoryEntryDate(dir,#PB_Date_Modified)
          EndIf
        Else
          AddElement(files())
          files()\typ=#deletefile
          files()\right$=name$
        EndIf
      
      ElseIf (Not (name$="." Or name$="..")) ;And findblack(in$+name$)=#False
        If findleft(files(),name$,type)=#False
          AddElement(files())
          files()\typ=type
        EndIf
        files()\right$=name$
        files()\dateRight=DirectoryEntryDate(dir,#PB_Date_Modified)
      EndIf
    Wend
    FinishDirectory(dir)
  EndIf
  
  
  ;- Erstmal löschen
  ForEach files()
    ;While WindowEvent():Wend
    If files()\typ=#deletefile
      stat_del+1
      PrintNN(NameCut("RemoveFile "+out$,files()\right$))
      addiferror("Can't delete "+out$+files()\right$,DeleteFile(out$+files()\right$))
      DeleteElement(files())
    ElseIf files()\left$="" And files()\right$<>""
      If files()\typ=#PB_DirectoryEntry_File
        stat_Del+1
        PrintNN(NameCut("RemoveFile "+out$,files()\right$+".7z"))
        addiferror("Can't delete "+out$+files()\right$+".7z",DeleteFile(out$+files()\right$+".7z"))
      Else
        Stat_DelFolder+1
        PrintNN(NameCut("RemoveDir "+out$,files()\right$))
        addiferror("Can't remove "+out$+files()\right$,DeleteDirectory(out$+files()\right$,"*.*",#PB_FileSystem_Recursive))
      EndIf
      DeleteElement(files())
    EndIf
  Next
  
  ;- Neue Dateien.
  ForEach files()
    ;While WindowEvent():Wend

    If files()\typ=#PB_DirectoryEntry_File
      If files()\left$<>"" And files()\right$=""
        stat_new+1
        PrintNN(NameCut("New "+out$,files()\left$))
        AddIfError("Can't create "+out$+files()\left$+".7z", Compress(in$,out$,files()\left$,files()\leftShort$,files()\dateLeft))
        DeleteElement(files())
      Else
        If files()\dateleft<>files()\dateRight
          Stat_Update+1
          PrintNN(NameCut("Update "+out$,files()\left$))
          DeleteFile(out$+files()\right$+".7z")
          AddIfError("Can't Update "+out$+files()\left$+".7z",Compress(in$,out$,files()\left$,files()\leftShort$,files()\dateLeft))
        Else
          Stat_Same+1
          ;PrintN("Same "+in$+files()\left$)
        EndIf
        DeleteElement(files())
      EndIf
    EndIf    
  Next
  
  ;Subdirectory scannen
  ForEach files()
    ;While WindowEvent():Wend
    ;Debug "## "+ files()\left$+" * "+files()\right$+" * "+Str(files()\dateLeft)+" * "+Str(files()\dateRight)
    If files()\typ=#PB_DirectoryEntry_Directory
      If files()\left$<>"" And files()\right$=""
        If dosub
          Stat_NewFolder+1
          PrintNN(NameCut("New "+out$,files()\left$))
          AddIfError("Can't create directory "+out$+files()\left$,CreateDirectory(out$+files()\left$))
          dodir(in$+files()\left$+"\",out$+files()\left$+"\")
        EndIf
      Else
        If dosub
          dodir(in$+files()\left$+"\",out$+files()\left$+"\")
        EndIf
      EndIf
      DeleteElement(files())
    EndIf    
  Next
  
  If ListSize(files())
    Debug "FEHLER! nicht verarbeitete Sachen"
  EndIf
  
  ;Debug "<---"
EndProcedure

Procedure Print_info()
PrintN("robo7z <inpath> <outpath> [-pPassword] [-w] [-c] [-s] [-f<size>] [-eExcludeWildcard] [-bPath [-bPath]]")
PrintN("  -c test after creation of the archive")
PrintN("  -p set Password")
PrintN("  -e exclude Wildcards '-e*.bak;*.ini'")
PrintN("  -b exclude path '-bc:\windows\temp' '-b*cache*'")
PrintN("  -s scan subdirectories")
PrintN("  -w Use short names for file names with percent (WebDav)")
PrintN("  -f Use short names for file names longer than <size> characters")

PrintN("")
EndProcedure


;- Start


tempdir$=endslash(StringField(GetEnvironmentVariable("temp"),1,";"))+"robo7z"
a$="abcdefghijklmnopqrstuvwxyz01234567890"
tempdir$+Hex(Date())+Mid(a$,Random(Len(a$)-1)+1,1)+Mid(a$,Random(Len(a$)-1)+1,1)+"\"

CreateDirectory( tempdir$)

OpenConsole()
;OpenWindow(1,0,0,10,10,"test",#PB_Window_Minimize      |#PB_Window_ScreenCentered )
;SetWindowCallback(@MyWindowCallback())
;OpenLibrary(1, "kernel32.dll") 

c= CountProgramParameters()
If c<2
  PrintN("parameter error")
  print_info()
  End 1
EndIf

in$=endslash(ProgramParameter(0))
out$=endslash(ProgramParameter(1))
For i=2 To c-1
  a$=ProgramParameter(i)
  b$=Right(a$,Len(a$)-2)
  Select LCase(Left(a$,2))
    Case "-b"
      quickadd(blacklist(),EndSlash(b$))
    Case "-e"
      exclude$=b$
    Case "-p"
      password$=" -p"+b$
    Case "-c"
      docheck=#True
    Case "-s"
      dosub=#True
    Case "-w"
      WebPercent=#True
    Case "-f"
      shortname=Val(b$)
    Case "-?"
      print_info()
      End
    Default
      Debug b$
      PrintN("parameter error")
      print_info()

      End 1
  EndSelect
Next

Debug "Exclude:"+exclude$
Debug "Password:"+password$

ForEach blacklist()
  Debug "Black:"+blacklist()
Next


;While WindowEvent():Wend
CreateDirectory(out$)

EnableGraphicalConsole(1)

printm("In.:"+in$)
printm("Out:"+out$)
dodir(in$,out$)
printM("")
PrintN("No Change.....:"+Str(Stat_Same))
PrintN("New Files.....:"+Str(stat_new))
PrintN("Updated Files.:"+Str(Stat_Update))
PrintN("New Folders...:"+Str(Stat_NewFolder))
PrintN("Delete Files..:"+Str(Stat_Del))
PrintN("Delete Folders:"+Str(Stat_DelFolder))
PrintN("Errors........:"+Str(ListSize(errortxt())))
PrintN("")

If ListSize(ErrorTxT())
  ;PrintN("-------------------------")
  ;PrintN("- ERROR - ERROR - ERROR -")
  ;PrintN("-------------------------")
  ;ForEach errortxt()
  ;  PrintM(errortxt())
  ;Next
  CompilerIf #PB_Compiler_Debugger
    Input()
  CompilerEndIf
  End 1 
EndIf


CompilerIf #PB_Compiler_Debugger
  Input()
CompilerEndIf

CloseLibrary(dll7zip)
CloseConsole()
DeleteDirectory( tempdir$,"*.*",#PB_FileSystem_Recursive|#PB_FileSystem_Force)
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
WPö
Moderator
Beiträge: 669
Registriert: 27.05.2008 12:44
Wohnort: Oberland
Kontaktdaten:

Re: robo7z

Beitrag von WPö »

Hallo, GPI!

Vielen Dank für den Quelltext. Ohne ihn jetzt genauer angesehen zu haben (Zeitmangel), scheint das recht nützlich für die Einarbeitung in Dateikompression zu sein. Suchte vor einigen Wochen z.B. nach einer solchen Möglichkeit.

Ich verschiebe allerdings dieses Thema nach Codes, Tipps usw., da Dein Quelltext thematisch doch wohl eher dort reinpaßt.

Gruß - WPö
Ich glaube nur der Statistik, die ich selbst gefälscht habe!
Meine Netzpräsenz: WPö.de
PB5.31 auf LMDE und Pentium T7200 2,00GHz, 4GB DDR2, ATI X1400.
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: robo7z

Beitrag von GPI »

Naja, wenn man nur 7z nutzen will (damit lassen sich auch zips öffnen)

Code: Alles auswählen

dll7zip=OpenLibrary(#PB_Any, "7-zip32.dll")
If dll7zip
  Prototype.l ProtoSevenZip(hWnd.l, szCmdLine.l, stOutput.l, dwSize.l = 0)
  Global SevenZip.ProtoSevenzip = GetFunction(dll7zip, "SevenZip")
  
  Prototype.l ProtoSevenZipCheckArchive(szFileName.p-ascii, iMode.l = 0)
  Global SevenZipCheckArchive.ProtoSevenZipCheckArchive = GetFunction(dll7zip, "SevenZipCheckArchive")
  
  ;Prototype.l ProtoSevenZipGetBackGroundMode()
  ;Global SevenZipGetBackGroundMode.ProtoSevenZipGetBackGroundMode = GetFunction(dll7zip, "SevenZipGetBackGroundMode")
  
  ;Prototype.l ProtoSevenZipSetBackGroundMode(BackGroundMode.l)
  ;Global SevenZipSetBackGroundMode.ProtoSevenZipSetBackGroundMode = GetFunction(dll7zip, "SevenZipSetBackGroundMode")
  
  
Else
  MessageRequester("Robo7z","Missing 7-zip32.dll")
  Debug "FEHLER!"
  End
EndIf

cmd$="a "+Chr(34)+".\myzip.7z"+Chr(34)+" "+Chr(34)+".\*.pb"+Chr(34)+" -t7z -bd -hide -mx9 -p35zsl1"
buffer$=space(1024)
  If SevenZip(0, @CMD$,@buffer$,1024)=0 
    debug "done"
  Else
    debug "Error:"+buffer$
  endif
Würde jetzt alle *.pb in myzip.7z komprimieren. Gibt in der DLL auch haufenweise Befehle, ob auszulesen, welche Dateien drin sind, leider kein packen/entpacken in Speicher/Disk. Dafür muss man immer SevenZip() benutzen. In Prinzip funktioniert das wie die Kommandozeilenversion von 7z.

robo7z ist aber halt eine praktische Anwendung des ganzen, also ein fertiges Programm das man bspw. für Backupzwecke benutzen kann.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Antworten