Warum wird mein Skript nicht Zip-Dateien erstellen?
Frage
#include <File.au3>
#include <Zip.au3>
#include <Array.au3>
; bad file extensions
Local $extData = "ade|adp|app|asa|ashx|asp|bas|bat|cdx|cer|chm|class|cmd|com|cpl|crt|csh|der|exe|fxp|gadget|hlp|hta|htr|htw|ida|idc|idq|ins|isp|its|jse|ksh|lnk|mad|maf|mag|mam|maq|mar|mas|mat|mau|mav|maw|mda|mdb|mde|mdt|mdw|mdz|msc|msh|msh1|msh1xml|msh2|msh2xml|mshxml|msi|msp|mst|ops|pcd|pif|prf|prg|printer|pst|reg|rem|scf|scr|sct|shb|shs|shtm|shtml|soap|stm|url|vb|vbe|vbs|ws|wsc|wsf|wsh"
Local $extensions = StringSplit($extData, "|")
; What is the root directory?
$rootDirectory = InputBox("Root Directory", "Please enter the root directory...")
archiveDir($rootDirectory)
Func archiveDir($dir)
$goDirs = True
$goFiles = True
; Get all the files under the current dir
$allOfDir = _FileListToArray($dir)
$tmax = UBound($allOfDir)
For $t = 0 To $tmax - 1
Next
Local $countDirs = 0
Local $countFiles = 0
$imax = UBound($allOfDir)
For $i = 0 To $imax - 1
If StringInStr(FileGetAttrib($dir & "\" & $allOfDir[$i]), "D") Then
$countDirs = $countDirs + 1
ElseIf StringInStr(($allOfDir[$i]), ".") Then
$countFiles = $countFiles + 1
EndIf
Next
If ($countDirs > 0) Then
Local $allDirs[$countDirs]
$goDirs = True
Else
$goDirs = False
EndIf
If ($countFiles > 0) Then
Local $allFiles[$countFiles]
$goFiles = True
Else
$goFiles = False
EndIf
$dirCount = 0
$fileCount = 0
For $i = 0 To $imax - 1
If (StringInStr(FileGetAttrib($dir & "\" & $allOfDir[$i]), "D")) And ($goDirs == True) Then
$allDirs[$dirCount] = $allOfDir[$i]
$dirCount = $dirCount + 1
ElseIf (StringInStr(($allOfDir[$i]), ".")) And ($goFiles == True) Then
$allFiles[$fileCount] = $allOfDir[$i]
$fileCount = $fileCount + 1
EndIf
Next
; Zip them if need be in current spot using 'ext_zip.zip' as file name, loop through each file ext.
If ($goFiles == True) Then
$fmax = UBound($allFiles)
For $f = 0 To $fmax - 1
$currentExt = getExt($allFiles[$f])
$position = _ArraySearch($extensions, $currentExt)
If @error Then
MsgBox(0, "Not Found", "Not Found")
Else
$zip = _Zip_Create($dir & "\" & $currentExt & "_zip.zip")
_Zip_AddFile($zip, $dir & "\" & $allFiles[$f])
EndIf
Next
EndIf
; Get all dirs under current DirCopy
; For each dir, recursive call from step 2
If ($goDirs == True) Then
$dmax = UBound($allDirs)
$rootDirectory = $rootDirectory & "\"
For $d = 0 To $dmax - 1
archiveDir($rootDirectory & $allDirs[$d])
Next
EndIf
EndFunc
Func getExt($filename)
$pos = StringInStr($filename, ".")
$retval = StringTrimLeft($filename, $pos - 1)
Return $retval
EndFunc
habe ich eine Liste der Dateierweiterungen. Dieses Skript sollte ein Verzeichnis durchlaufen (und Unterverzeichnisse), zip (getrennte Zip-Dateien für jede Erweiterung) alle Dateien mit diesen Erweiterungen.
Warum es schafft keine ZIP-Dateien?
Lösung
In der Funktion StringTrimLeft ( "string", count), count ist die Anzahl der Zeichen zu trimmen.
$filename = "filename.zip"
$pos = StringInStr($filename, ".") ; $pos will be equal to 9
so ...
$retval = StringTrimLeft($filename, $pos + 1); this will remove 10 characters = ip
Andere Tipps
Zwei Vorschläge:
- Add
MsgBox(0, "Zip", "Got here")
in IhremIf ($currentExt == $extensions[$e]) Then
. Sie sollten sehen, dass Sie nie bekommen. - Im Zusammenhang mit dem oben Ihre
getExt
Funktion für die Erweiterung der Datei des richtigen Wert nicht zurück.
UPDATE
Sie ging ein wenig zu weit mit Ihrem bearbeiten getExt
.
Versuchen Sie diese:
Func getExt($filename)
$pos = StringInStr($filename, ".")
$retval = StringTrimLeft($filename, $pos)
Return $retval
EndFunc
UPDATE 2
In Bezug auf Ihr Problem, wo es keine Ordner über die 2. Ebene nicht verarbeitet, Ihr Problem ist, dass Sie $rootDirectory
in Ihrem rekursiven Aufruf verwenden, wo Sie Gebrauch $dir
benötigen.
Ändern Sie den letzten Teil Ihrer archiveDir
Funktion folgt aus:
; For each dir, recursive call from step 2
If ($goDirs == True) Then
$dmax = UBound($allDirs)
$dir = $dir & "\"
For $d = 0 to $dmax - 1
archiveDir($dir & $allDirs[$d])
Next
EndIf
Ich habe versucht, den Code so ausgeführt wird, und sicher genug, es ist fehlgeschlagen. Ich habe dann ein
MsgBox(0, "error", @error & " " & $currentExt)
in dem „Wenn @error“ Block zu sehen, ob ich herausfinden kann, warum es versagt. Ein Blick in die Dokumentation Das Ergebnis war die @error kam als 6. zurück, heißt es, dass ein Fehlercode von 6 bedeuten, dass der Wert nach nicht im Array gefunden wurde. Und dann sagte der $ currentExt mir Wert wurde auf „.asp“.
Der Grund, es nicht gefunden werden konnte, war, weil es keine Perioden in den Erweiterungsnamen in der Anordnung sind. Wenn Sie die getext () Funktion näher betrachten, bevor Sie 1, um den $ Positionswert fügen ... und jetzt sind Sie 1 von dem Wert subtrahiert wird ... Hier ist eine Darstellung, wie StringTrimLeft () funktioniert ...
$filename = "filename.txt"
$pos = StringInStr($filename, ".") ; $pos will be equal to 9
$retval = StringTrimLeft($filename, $pos + 1); this will remove 10 characters = xt, that's too much.
$retval = StringTrimLeft($filename, $pos - 1); this will remove 8 characters = .txt, that's not enough.
$retval = StringTrimLeft($filename, $pos); this will remove 9 characters = txt, that's juuuuuuust right!
So ist die Lösung entweder add "" vor alle Erweiterungen in Ihrem Array oder Ihre getext () Funktion ändern:
Func getExt($filename)
$pos = StringInStr($filename, ".")
$retval = StringTrimLeft($filename, $pos)
Return $retval
EndFunc
Es gibt eine weitere Option, die Sie in aussehen könnten, und das ist mit der _PathSplit () Funktion in File.au3 gefunden, aber da Ihr Skript ist so nah an dieser Stelle zu arbeiten, würde ich mich keine Sorgen darüber, aber vielleicht in der Zukunft Sie es stattdessen verwenden können.
Und eine letzte Anmerkung ... Nachdem ich getext () änderte sich die fallen zu lassen „“ Ihr Skript lief super.