Pregunta

#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

Tengo una lista de extensiones de archivo. Este script debe ir a través de un directorio (y subdirectorios), cerrar la cremallera (zip archivos separados para cada extensión) todos los archivos por esas extensiones.

¿Por qué no crear archivos zip?

¿Fue útil?

Solución

En la función StringTrimLeft ( "cadena", recuento), el recuento es el número de caracteres que desea recortar.

$filename = "filename.zip"

$pos = StringInStr($filename, ".") ; $pos will be equal to 9

así que ...

$retval = StringTrimLeft($filename, $pos + 1); this will remove 10 characters = ip

Otros consejos

Dos sugerencias:

  1. Agregar MsgBox(0, "Zip", "Got here") dentro de su If ($currentExt == $extensions[$e]) Then. Debería ver que nunca está recibiendo allí.
  2. En relación con lo anterior, la función getExt no devuelve el valor correcto para la extensión del archivo.

ACTUALIZACIÓN

fue un poco demasiado lejos con tu edición en getExt.

Prueba esto:

Func getExt($filename)
  $pos = StringInStr($filename, ".")
  $retval = StringTrimLeft($filename, $pos)
  Return $retval
EndFunc  


ACTUALIZACIÓN 2

En cuanto a su problema en el que no procesa carpetas más allá del segundo nivel, el problema es que está utilizando en su $rootDirectory llamada recursiva donde es necesario el uso $dir.

Cambiar la última parte de su función archiveDir a esto:

  ; 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

Intenté funcionar el código tal como está, y por supuesto, fracasó. Entonces puse a

MsgBox(0, "error", @error & " " & $currentExt)

en el "Si @error" bloque para ver si podía averiguar por qué estaba fallando. El resultado fue la @error regresó como 6. Mirando en la documentación, se dice que un código de error de 6 significa que el valor buscado no se encuentra en la matriz. Y entonces los $ currentExt me dijo que es el valor se establece en ".asp".

La razón por la que no se pudo encontrar fue porque no hay períodos en los nombres de extensión de la matriz. Si se mira más de cerca a la función getext (), y antes que sumar 1 al valor de posición $ ... y ahora está restando 1 del valor ... He aquí un ejemplo de cómo funciona StringTrimLeft () ...

$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!

Así que la solución es o bien añadir "" delante de todas las extensiones en la matriz, o cambiar su función getext ():

Func getExt($filename)
    $pos = StringInStr($filename, ".")
    $retval = StringTrimLeft($filename, $pos)
    Return $retval
EndFunc

Hay una opción más que usted podría mirar en, y que está utilizando la función _PathSplit () encuentra en File.au3, pero desde su guión está tan cerca de trabajar en este punto, yo no me preocuparía, pero quizás en el futuro se podría utilizar en su lugar.

Y una última nota ... Después de haber cambiado getext () para dejar caer el "", su guión corrió muy bien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top