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

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"
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"
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)