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?

War es hilfreich?

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:

  1. Add MsgBox(0, "Zip", "Got here") in Ihrem If ($currentExt == $extensions[$e]) Then. Sie sollten sehen, dass Sie nie bekommen.
  2. 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top