ZIP - Packen / Entpacken mit Windows eigener Funktion

    • Offizieller Beitrag

    Hi,
    hiermit könnt ihr ZIP-Archive mit dem in Windows integrierten ZIP erstellen:

    Parameter $iIndexBase=1 ==> Falls das übergebene Array an Pos 0 einen Zähler führt ist BaseIndex=1 (Standard).
    _FileListToArray kann man leider nicht für das Array verwenden, da diese Funktion nicht den Pfad ausliest.

    Edit:
    NEU - nun auch Entpacken.

    Edit2:
    Fixed - Fehler Variablenname. Beim Zusammenführen der beiden Funktionen hatte ich vergessen die Variablennamen anzugleichen. Und keiner hats gemerkt ;)

    Edit3:
    Fixed - Relative Dateinamen. Der Pfad zur Zip-Datei kann jetzt relativ angegeben werden. Danke Oscar für den Hinweis.

    _BuildInZIP
    [autoit]

    ;===============================================================================
    ; Function Name: _BuildInZIP($sPath, $s_a_ToZip, $fUnZip=True, $iIndexBase=1, $fOverwrite=True)
    ; Description: Erstellt aus einer Datei od. einem Array von Dateien eine ZIP-Datei
    ; mit Hilfe der Windows eigenen ZIP-Funktion
    ; Parameter(s): $sPath Pfad der zu erstellenden ZIP-Datei // Bestehenden ZIP-Datei
    ; $s_a_ToZip String der Einzeldatei oder Array der zu zippenden Dateien
    ; // Pfad des Zielordners, in den entpackt werden soll
    ; $fUnZip=True Entpacken=True, Packen=False (Standard)
    ; $iIndexBase Index Basis (erstes Element mit Pfad) des übergebenen Arrays (0 od.1)
    ; $fOverwrite Falls $sPath existiert ==> Überschreiben (Standard=True)
    ; Return Value(s): Erfolg 1
    ; Fehler set @error 1 - Überschreiben aus, aber Zieldatei existiert
    ; 2 - Zieldatei endet nicht auf ".zip"
    ; 3 - zu komprimierende Datei existiert nicht
    ; @extended: Anzahl der fehlenden Dateien
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;===============================================================================
    Func _BuildInZIP($sPath, $s_a_ToZip, $fUnZip=False, $iIndexBase=1, $fOverwrite=True)
    Local $fh, $sNul = '', $sZIPHeader, $objShell = ObjCreate("Shell.Application"), $objZipOrdner, $err = 0
    $sPath = FileGetLongName($sPath, 1)
    If $fUnZip Then
    Local $temp, $objZip
    If Not FileExists($s_a_ToZip) Then DirCreate($s_a_ToZip)
    $temp = $objShell.Namespace($s_a_ToZip)
    $objZip = $objShell.Namespace($sPath)
    $temp.CopyHere($objZip.Items)
    Return 1
    EndIf
    If (Not $fOverwrite) And FileExists($sPath) Then Return SetError(1,0,0)
    If StringRight($sPath, 4) <> '.zip' Then Return SetError(2,0,0)
    For $i = 1 To 18
    $sNul &= Chr(0)
    Next
    $sZIPHeader = Chr(80) & Chr(75) & Chr(5) & Chr(6) & $sNul
    $fh = FileOpen($sPath, 10)
    FileWrite($fh, $sZIPHeader)
    FileClose($fh)
    $objZipOrdner = $objShell.Namespace($sPath)
    If Not IsArray($s_a_ToZip) Then
    If Not FileExists($s_a_ToZip) Then Return SetError(3,1,0)
    $objZipOrdner.CopyHere($s_a_ToZip)
    Sleep(1000)
    Return 1
    EndIf
    For $i = $iIndexBase To UBound($s_a_ToZip) -1
    If Not FileExists($s_a_ToZip[$i]) Then
    $err += 1
    ContinueLoop
    EndIf
    $objZipOrdner.CopyHere($s_a_ToZip[$i])
    Sleep(1000)
    Next
    If $err Then Return SetError(3,$err,0)
    Return 1
    EndFunc ;==>_BuildInZIP

    [/autoit]
  • Gute Arbeit, BugFix!
    Is dir gut gelungen, wie immer: kurzer Code, große Funktion ;D[MSIE_newline_end ]

    • Offizieller Beitrag

    Hallo BugFix!
    Eine nette Funktion, allerdings gibt es einen Fehler ("The requested action with this object has failed."), wenn man für das ZIP-Archiv eine relative Pfadangabe (z.B. einfach nur "test.zip") verwendet.
    Diesen Fehler könntest Du aber noch abfangen, indem Du an den Anfang Deiner Funktion folgendes einfügst:

    [autoit]

    $sPath = FileGetLongName($sPath, 1)

    [/autoit]


    Mit dem optionalen Parameter ",1" werden relative Pfade in absolute Pfade umgewandelt.

    Ansonsten: sehr gut! Kommt in mein Archiv! :thumbup:

  • Man kann auch einen Ordner angeben, den man packen möchte! Das Problem ist nur, dass man ohne weiteres nicht prüfen kann, wann der Pack Thread beendet ist!

    Hier meine Testversion:

    Spoiler anzeigen
    [autoit]


    #include <WinAPi.au3>
    #include <Array.au3>
    Opt('MustDeclareVars', 1)

    [/autoit] [autoit][/autoit] [autoit]

    HotKeySet("{ESC}", "_Exit")
    Global Const $TH32CS_SNAPTHREAD = 0x00000004
    Global Const $THREADENTRY32 = "dword dwSize;dword cntUsage;dword th32ThreadId;dword th32OwnerProcessID;long tpBasePri;long tpDeltaPri;dword dwFlags;"

    [/autoit] [autoit][/autoit] [autoit]

    Global $zip_file = "c:\Test.zip"
    Global $source_folder = @WindowsDir & "\Inf\"
    Add_Folder_2_ZIP($source_folder, $zip_file)

    [/autoit] [autoit][/autoit] [autoit]

    Func Add_Folder_2_ZIP($folder, $zip_filename, $flag = 4)
    Local $hZIP, $ZIP_fileheader, $obj_ZIP, $obj_Folder, $obj_ZIP_Folder, $obj_Copy, $arr, $arr1, $arr2
    $hZIP = FileOpen($zip_filename, 26)
    $ZIP_fileheader = Chr(80) & Chr(75) & Chr(5) & Chr(6) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0)
    FileWrite($hZIP, $ZIP_fileheader)
    FileClose($hZIP)

    [/autoit] [autoit][/autoit] [autoit]

    $arr1 = _GetAllProcessThreads(@AutoItPID)
    $obj_ZIP = ObjCreate("Shell.Application")
    $obj_Folder = $obj_ZIP.NameSpace($folder)
    $obj_ZIP_Folder = $obj_ZIP.NameSpace($zip_filename)
    $obj_Copy = $obj_ZIP.NameSpace($zip_filename).CopyHere($obj_Folder.Items, $flag) ;add files to ZIP archive
    While 1
    Sleep(1000)
    $arr2 = _GetAllProcessThreads(@AutoItPID)
    $arr = _ArrayDiff($arr2, $arr1)
    If $arr[0] = 0 Then ExitLoop
    WEnd
    EndFunc ;==>Add_Folder_2_ZIP

    [/autoit] [autoit][/autoit] [autoit]

    ; -------------------------------------------------
    ; Function: _ArrayDiff
    ; Purpose: Returns an array of elements from $avArray1 that do not occur in $avArray2
    ; Syntax: _ArrayDiff(ByRef $avArray1, ByRef $avArray2 [, $f_CaseSense = 0])
    ; Where: $avArray1 = ByRef source array
    ; $avArray2 = ByRef array to search for $avArray1 elements
    ; $f_CaseSense (optional) = Case sensitivity as passed to StringInStr()
    ; 0 = not case sensitive, using the user's locale (default)
    ; 1 = case sensitive
    ; 2 = not case sensitive, using a basic/faster comparison
    ; Returns: On success returns an array with [0] = count containing any elements
    ; from $avArray1 that do not occur in $avArray2
    ; If all elements in $avArray1 occur in $avArray2 then [0] = 0
    ; On Failure returns 1-element array [0] = 0 and sets @error.
    ; Author: PsaltyDS on http://www.autoitscript.com/forum
    ; Notes: Similar to PHP array_diff function
    ; --------------------------------------------------
    Func _ArrayDiff(ByRef $avArray1, ByRef $avArray2, $f_CaseSense = 0)
    Local $avRET[1] = [0], $sRET = ""

    [/autoit] [autoit][/autoit] [autoit]

    If (IsArray($avArray1) = 0) Or (UBound($avArray1, 0) <> 1) Then Return SetError(1, 1, $avRET)
    If (IsArray($avArray2) = 0) Or (UBound($avArray2, 0) <> 1) Then Return SetError(1, 2, $avRET)

    [/autoit] [autoit][/autoit] [autoit]

    Local $sArray2 = Chr(1) & _ArrayToString($avArray2, Chr(1)) & Chr(1)

    [/autoit] [autoit][/autoit] [autoit]

    For $n = 0 To UBound($avArray1) - 1
    If Not StringInStr($sArray2, Chr(1) & $avArray1[$n] & Chr(1)) Then $sRET &= $avArray1[$n] & Chr(1)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    If StringLen($sRET) Then
    $sRET = StringTrimRight($sRET, 1)
    $avRET = StringSplit($sRET, Chr(1))
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Return $avRET
    EndFunc ;==>_ArrayDiff

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _GetAllProcessThreads($iPid) ; thanks to monoceres
    Local $call = DllCall("Kernel32.dll", "ptr", "CreateToolhelp32Snapshot", "dword", $TH32CS_SNAPTHREAD, "dword", 0)
    Local $handle = $call[0]
    Local $RetArr[1]
    Local $te32 = DllStructCreate($THREADENTRY32)
    DllStructSetData($te32, "dwSize", DllStructGetSize($te32))
    $call = DllCall("Kernel32.dll", "int", "Thread32First", "ptr", $handle, "ptr", DllStructGetPtr($te32))
    If DllStructGetData($te32, "th32OwnerProcessID") = $iPid Then _GetAllThreads_ArrHelper($RetArr, $te32)
    Do
    $call = DllCall("Kernel32.dll", "int", "Thread32Next", "ptr", $handle, "ptr", DllStructGetPtr($te32))
    If Not $call[0] Then ExitLoop
    If DllStructGetData($te32, "th32OwnerProcessID") = $iPid Then _GetAllThreads_ArrHelper($RetArr, $te32)
    Until True And False
    _ArrayDelete($RetArr, 0)
    _WinAPI_CloseHandle($handle)
    Return $RetArr
    EndFunc ;==>_GetAllProcessThreads

    [/autoit] [autoit][/autoit] [autoit]

    Func _GetAllThreads_ArrHelper(ByRef $arr, $TE32_Struct) ; thanks to monoceres
    Local $ub = UBound($arr)
    ReDim $arr[$ub + 1]
    $arr[$ub] = DllStructGetData($TE32_Struct, "th32ThreadId")
    EndFunc ;==>_GetAllThreads_ArrHelper

    [/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    Exit
    EndFunc

    [/autoit]

    Ich habe versucht, bevor das Packen anfängt, ein Snapshot von the Threads zu machen. Das Packen ist genau dan fertig, wenn der Urzustand der Threads wieder erreicht ist!

    Kennt jemand eine bessere Lösung?

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    • Offizieller Beitrag

    Hi UEZ,
    das ist leider das Problem, dass kein Event ausgelöst wird. Ich hab mal noch das Flag für Progress hinzugefügt. Dann erhält mann zumindest ein Fenster mit Progressbar. Mal noch Testen ob das immer eindeutig zu identifizieren ist, dann kann man das Verschwinden des Fensters als Event verwenden.

  • Hallo,

    wie kann ich abfragen, ob die dll (zipfldr.dll) auch registriert ist?
    Unter XP bekomme ich nach dem Ausführen von regsvr32.dll /u zipfldr.dll und anschließendem versuch ne Datei zu packen/entpacken logischerweise ne Fehlermeldung.
    Ich könnte natürlich die zipfldr.dll per AutoIt auch wieder registrieren, aber mich würde interessieren, ob ich mit AutoIt auch den Registrierungszustand einer DLL abfragen kann.
    Hat da jemand nen Tipp (Wink mit nem Zaunpfahl ;) ) für mich?


    Gruss

    <3 Jetzt, Hier, Immer <3

  • Hallo,

    wie kann ich abfragen, ob die dll (zipfldr.dll) auch registriert ist?
    Unter XP bekomme ich nach dem Ausführen von regsvr32.dll /u zipfldr.dll und anschließendem versuch ne Datei zu packen/entpacken logischerweise ne Fehlermeldung.
    Ich könnte natürlich die zipfldr.dll per AutoIt auch wieder registrieren, aber mich würde interessieren, ob ich mit AutoIt auch den Registrierungszustand einer DLL abfragen kann.
    Hat da jemand nen Tipp (Wink mit nem Zaunpfahl ;) ) für mich?


    Gruss


    Ich hab mal in der Registry gesucht, vielleicht ist ja was dabei ;) (Bei mir war die CLSID für CompressedFolder {E88DCCE0-B7B3-11d1-A9F0-00AA0060FA31})

    Code
    HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\DUIBags\ShellFolders\{E88DCCE0-B7B3-11D1-A9F0-00AA0060FA31}
    HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{E88DCCE0-B7B3-11d1-A9F0-00AA0060FA31}
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved [Key mit der CLSID muss existieren?)
  • Hallo BugFix,

    bin gerade am Testen deiner Func. Bekomme leider folgende Fehlermeldung:

    Spoiler anzeigen
    Code
    >"C:\Programme\AutoIt3\SciTE\AutoIt3Wrapper\AutoIt3Wrapper.exe" /run /prod /ErrorStdOut /in "C:\Programme\AutoIt3\Downloads\BugFix\BuildInZIP.au3" /autoit3dir "C:\Programme\AutoIt3" /UserParams    
    +>20:00:49 Starting AutoIt3Wrapper v.2.0.1.24    Environment(Language:0407  Keyboard:00000407  OS:WIN_XP/Service Pack 3  CPU:X86 OS:X86)
    >Running AU3Check (1.54.19.0)  from:C:\Programme\AutoIt3
    +>20:00:49 AU3Check ended.rc:0
    >Running:(3.3.6.1):C:\Programme\AutoIt3\autoit3.exe "C:\Programme\AutoIt3\Downloads\BugFix\BuildInZIP.au3"    
    C:\Programme\AutoIt3\Downloads\BugFix\BuildInZIP.au3 (32) : ==> The requested action with this object has failed.:
    $temp.CopyHere($objZip.Items)
    $temp.CopyHere($objZip.Items)^ ERROR
    ->20:00:54 AutoIT3.exe ended.rc:1
    >Exit code: 1    Time: 7.016

    Hier das Skript das diese Meldung verursacht:

    Spoiler anzeigen
    [autoit]

    #Include <File.au3>
    #Include <Array.au3>
    $s_a_ToZip = _FileListToArray("C:\Programme\AutoIt3\Deutsche Hilfe\","*")
    _ArrayDisplay($s_a_ToZip)
    _BuildInZIP("C:\Programme\AutoIt3\Deutsche Hilfe.ZIP",$s_a_ToZip,True,1)

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Function Name: _BuildInZIP($sPath, $s_a_ToZip, $fUnZip=True, $iIndexBase=1, $fOverwrite=True)
    ; Description: Erstellt aus einer Datei od. einem Array von Dateien eine ZIP-Datei
    ; mit Hilfe der Windows eigenen ZIP-Funktion
    ; Parameter(s): $sPath Pfad der zu erstellenden ZIP-Datei // Bestehenden ZIP-Datei
    ; $s_a_ToZip String der Einzeldatei oder Array der zu zippenden Dateien
    ; // Pfad des Zielordners, in den entpackt werden soll
    ; $fUnZip=True Entpacken=True, Packen=False (Standard)
    ; $iIndexBase Index Basis (erstes Element mit Pfad) des übergebenen Arrays (0 od.1)
    ; $fOverwrite Falls $sPath existiert ==> Überschreiben (Standard=True)
    ; Return Value(s): Erfolg 1
    ; Fehler set @error 1 - Überschreiben aus, aber Zieldatei existiert
    ; 2 - Zieldatei endet nicht auf ".zip"
    ; 3 - zu komprimierende Datei existiert nicht
    ; @extended: Anzahl der fehlenden Dateien
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;===============================================================================
    Func _BuildInZIP($sPath, $s_a_ToZip, $fUnZip=False, $iIndexBase=1, $fOverwrite=True)
    Local $fh, $sNul = '', $sZIPHeader, $objShell = ObjCreate("Shell.Application"), $objZipOrdner, $err = 0
    $sPath = FileGetLongName($sPath, 1)
    If $fUnZip Then
    Local $temp, $objZip
    If Not FileExists($s_a_ToZip) Then DirCreate($s_a_ToZip)
    $temp = $objShell.Namespace($s_a_ToZip)
    $objZip = $objShell.Namespace($sPath)
    $temp.CopyHere($objZip.Items)
    Return 1
    EndIf
    If (Not $fOverwrite) And FileExists($sPath) Then Return SetError(1,0,0)
    If StringRight($sPath, 4) <> '.zip' Then Return SetError(2,0,0)
    For $i = 1 To 18
    $sNul &= Chr(0)
    Next
    $sZIPHeader = Chr(80) & Chr(75) & Chr(5) & Chr(6) & $sNul
    $fh = FileOpen($sPath, 10)
    FileWrite($fh, $sZIPHeader)
    FileClose($fh)
    $objZipOrdner = $objShell.Namespace($sPath)
    If Not IsArray($s_a_ToZip) Then
    If Not FileExists($s_a_ToZip) Then Return SetError(3,1,0)
    $objZipOrdner.CopyHere($s_a_ToZip)
    Sleep(1000)
    Return 1
    EndIf
    For $i = $iIndexBase To UBound($s_a_ToZip) -1
    If Not FileExists($s_a_ToZip[$i]) Then
    $err += 1
    ContinueLoop
    EndIf
    $objZipOrdner.CopyHere($s_a_ToZip[$i])
    Sleep(1000)
    Next
    If $err Then Return SetError(3,$err,0)
    Return 1
    EndFunc ;==>_BuildInZIP

    [/autoit]

    was mache ich falsch :?: Ich wollte deine Funktion testen, damit ich hier: [ offen ] Ordner aus einem Pfad ausfiltern und isolieren (batch umsetzung vorhanden) helfen kann,

    mfg (Auto)Bert

  • Hallo Oscar ,

    danke für den Hinweis (hätte wohl den Eröffnungspost besser lesen sollen). So klappt's:

    Spoiler anzeigen
    [autoit]

    #Include <File.au3>

    [/autoit] [autoit][/autoit] [autoit]

    _FolderToZip("C:\Programme\AutoIt3\Deutsche Hilfe\")

    [/autoit] [autoit][/autoit] [autoit]

    func _FolderToZip($spath)
    ;einziger Parameter der Pfad zu dem Ordner der gepackt werden soll mit abschliessenden \
    $s_a_ToZip = _FileListToArray($sPath,"*")
    for $i = 1 to $s_a_ToZip[0]
    $s_a_ToZip[$i] = $sPath & $s_a_ToZip[$i]
    Next
    _BuildInZIP(StringTrimRight($sPath,1) & ".ZIP",$s_a_ToZip,False,1)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Function Name: _BuildInZIP($sPath, $s_a_ToZip, $fUnZip=True, $iIndexBase=1, $fOverwrite=True)
    ; Description: Erstellt aus einer Datei od. einem Array von Dateien eine ZIP-Datei
    ; mit Hilfe der Windows eigenen ZIP-Funktion
    ; Parameter(s): $sPath Pfad der zu erstellenden ZIP-Datei // Bestehenden ZIP-Datei
    ; $s_a_ToZip String der Einzeldatei oder Array der zu zippenden Dateien
    ; // Pfad des Zielordners, in den entpackt werden soll
    ; $fUnZip=True Entpacken=True, Packen=False (Standard)
    ; $iIndexBase Index Basis (erstes Element mit Pfad) des übergebenen Arrays (0 od.1)
    ; $fOverwrite Falls $sPath existiert ==> Überschreiben (Standard=True)
    ; Return Value(s): Erfolg 1
    ; Fehler set @error 1 - Überschreiben aus, aber Zieldatei existiert
    ; 2 - Zieldatei endet nicht auf ".zip"
    ; 3 - zu komprimierende Datei existiert nicht
    ; @extended: Anzahl der fehlenden Dateien
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;===============================================================================
    Func _BuildInZIP($sPath, $s_a_ToZip, $fUnZip=False, $iIndexBase=1, $fOverwrite=True)
    Local $fh, $sNul = '', $sZIPHeader, $objShell = ObjCreate("Shell.Application"), $objZipOrdner, $err = 0
    $sPath = FileGetLongName($sPath, 1)
    If $fUnZip Then
    Local $temp, $objZip
    If Not FileExists($s_a_ToZip) Then DirCreate($s_a_ToZip)
    $temp = $objShell.Namespace($s_a_ToZip)
    $objZip = $objShell.Namespace($sPath)
    $temp.CopyHere($objZip.Items)
    Return 1
    EndIf
    If (Not $fOverwrite) And FileExists($sPath) Then Return SetError(1,0,0)
    If StringRight($sPath, 4) <> '.zip' Then Return SetError(2,0,0)
    For $i = 1 To 18
    $sNul &= Chr(0)
    Next
    $sZIPHeader = Chr(80) & Chr(75) & Chr(5) & Chr(6) & $sNul
    $fh = FileOpen($sPath, 10)
    FileWrite($fh, $sZIPHeader)
    FileClose($fh)
    $objZipOrdner = $objShell.Namespace($sPath)
    If Not IsArray($s_a_ToZip) Then
    If Not FileExists($s_a_ToZip) Then Return SetError(3,1,0)
    $objZipOrdner.CopyHere($s_a_ToZip)
    Sleep(1000)
    Return 1
    EndIf
    For $i = $iIndexBase To UBound($s_a_ToZip) -1
    If Not FileExists($s_a_ToZip[$i]) Then
    $err += 1
    ContinueLoop
    EndIf
    $objZipOrdner.CopyHere($s_a_ToZip[$i])
    Sleep(1000)
    Next
    If $err Then Return SetError(3,$err,0)
    Return 1
    EndFunc ;==>_BuildInZIP

    [/autoit]

    mfg (Auto)Bert

    Einmal editiert, zuletzt von AutoBert (10. Juni 2010 um 23:13)


  • also das funktioniert bei mir nicht. hab das 1 zu 1 übernommen und bei mir kommt dieser fehler:

    Spoiler anzeigen

    >"C:\Programme\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "C:\Dokumente und Einstellungen\Andreas\Desktop\Kopie (2) von test.au3"
    C:\Dokumente und Einstellungen\Andreas\Desktop\Kopie (2) von test.au3 (3) : ==> Subscript used with non-Array variable.:
    for $i = 1 to $s_a_ToZip[0]
    for $i = 1 to $s_a_ToZip^ ERROR

    EDIT:

    Problem war, das dies nur funktioniert wenn die 7z.exe und die 7z.dll im selben pfad liegen.

    Einmal editiert, zuletzt von Inferior (11. Juni 2010 um 01:53)

  • Hallo,

    wenn ich die ZIP Datei entpacke und alle Datein überschreiben möchte bekomme ich immer die Windows Hinweis Meldung, ob die Dateien wirklich überschrieben werden sollen.

    Kann man irgendwie schon im Script einstellen, dass er überschreiben soll ohne Nachzufragen?

    Ahja ich habe WinVista in Benutzung.

  • Hallo BugFix,
    ich habe mal eine Frage zu der Funktion "_BuildInZIP".

    Kann man beim Entpacken die Dateinamen (also die entpackt werden sollen) auslesen.
    Ich möchte deine tolle Funktion gerne nutzen. Aber ich möchte auch im Script "sehen" was ich da auspacke.

    Wie kann man das machen?

    Gruß Schumi

    • Offizieller Beitrag

    Kann man beim Entpacken die Dateinamen (also die entpackt werden sollen) auslesen.

    Können kann man sicher :D.
    Das ZIP-Dateiformat hat einen strukturierten Aufbau und enthält ein "Inhaltsverzeichnis".
    Zitat:
    "Nach der letzten Datei steht ein weiteres Kennzeichen, das aus den vier Byte "PK12" als CentralFileHeaderSign besteht.
    Dieses leitet den Abschnitt der zentralen Dateikennungen ein. Hier stehen in dichter Folge im Sinne eines Directory noch einmal alle im Archiv enthaltenen Dateinamen nebst beschreibenden Datenangaben."
    Die ZIP binär einlesen, den Einstiegspunkt für die Auflistung suchen und auslesen.
    Kannst dich gerne dran versuchen, ich habe vorerst nicht die Muße dazu.