Problema con recursividad

Pregunta Sin Miedo no te cortes cualquier cosa para empezar - Autoit se comienza facilmente.Para Ordenes o Comandos sueltos. Ver nota como preguntar.
Responder
avechuche
Hacker del Foro
Mensajes: 188
Registrado: 13 Ago 2009, 09:53

Problema con recursividad

Mensaje por avechuche »

Hola gente vengo con un problema. Resulta que desde un codigo HTML tengo que capturar ciertas carpetas y ciertos archivos. Si hay archivos, los tengo que descargar y si hay carpetas las tengo que listar para desp poder entrar en ellas y ahi hacer lo mismo, tomar el código HTML, listar las subcarpetas si es que las hay, listar los archivos si es que los hay y descargarlos tmb y asi sucesivamente hasta recorrer todas las carpetas y bajar todos los archivos que necesito. Alguna ayuda?
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Problema con recursividad

Mensaje por Chefito »

Como contesté en otro post hace tiempo te lo pongo aquí. Se trata de dos códigos que hice hace tiempo para buscar de forma recursiva archivos en cualquier ubicación. Participamos muchos, entre ellos uno de los que más, Ximorro. Como dije, lástima que se perdiera ese post. He intentado recuperarlo reviviendolo pero al final no he hecho nada.

http://www.emesn.com/autoitforum/viewto ... hivo#p9398

Aquí otro programa que hice para buscar textos varios ficheros de una ubicación y utilizo estas técnicas: http://www.emesn.com/autoitforum/viewto ... ador+texto

Te cuelgo el código de un script hecho por Rogue5099 donde muestra su función de búsqueda de archivos por recursión.

Código: Seleccionar todo

#include <File.au3>
#include <GUIConstants.au3>
#include <Array.au3>

Global $temppath = @ScriptDir

GUICreate("Inventory", 320, 265, -1, @DesktopHeight/10)
GUICtrlCreateLabel("Inventory v1.03   -   Created by Rogue5099", 42, 5, 375, 20)
$Button_1 = GUICtrlCreateButton("Take Invenotry", 200, 34, 100, 50)
$Checkbox_1 = GUICtrlCreateCheckbox("Include Subfolders", 10, 30)
$Checkbox_2 = GUICtrlCreateCheckbox("Include Full File Path", 10, 55)
GUICtrlCreateLabel("File type to search for. i.e. .jpg,.mp3 (Seperate /w Comma):", 8, 97, 325, 20)
Global $Input3 = GUICtrlCreateInput("*.*", 25, 117, 240, 20)
GUICtrlCreateLabel("Save Inventory File to:", 8, 147, 125, 20)
Global $Input1 = GUICtrlCreateInput(@ScriptDir, 25, 167, 240, 20)
$Browse_1 = GUICtrlCreateButton("...", 270, 167, 30, 20)
GUICtrlCreateLabel("Scan directory for file(s):", 8, 197, 125, 20)
Global $Input2 = GUICtrlCreateInput(@ScriptDir, 25, 217, 240, 20)
$Browse_2 = GUICtrlCreateButton("...", 270, 217, 30, 20)
GUICtrlCreateLabel("Progress:", 90, 240, 65, 20)
GUICtrlSetFont (-1, 10, 600)
Global $Label_1 = GUICtrlCreateLabel("Waiting", 165, 240, 95, 20)
GUICtrlSetFont (-1, 10, 600)
GUISetState (@SW_SHOW)

While 1
    $msg = GUIGetMsg()
    Select
        Case $msg = $GUI_EVENT_CLOSE
            ExitLoop
        Case $msg = $Button_1
            GUICtrlSetData($Label_1, "Scanning...")
            GUICtrlSetFont (-1, 10, 600)
            GUICtrlSetColor(-1, 16711680)
            $ext = StringSplit(GUICtrlRead($Input3), ",")
            $Amount = StringTrimRight(_ArrayToString($ext), StringLen(_ArrayToString($ext) - 2))
            $Text = GUICtrlRead($Input1) & "\Inventory.txt"
            If FileExists($Text) Then FileDelete($Text)
            For $x = 1 To $Amount
;~              MsgBox(0, "Check", $ext[$x])
                If BitAND(GUICtrlRead($Checkbox_1), $GUI_CHECKED) = $GUI_CHECKED And BitAND(GUICtrlRead($Checkbox_2), $GUI_CHECKED) = $GUI_CHECKED Then
                    $Inventory = _FileListToArray_Recursive(GUICtrlRead($Input2), $ext[$x], 1, 2, True)
                        If @Error = 4 Then MsgBox (48,"Error","No "&$ext&" Files Found.", 5)
                ElseIf BitAND(GUICtrlRead($Checkbox_1), $GUI_CHECKED) = $GUI_CHECKED And BitAND(GUICtrlRead($Checkbox_2), $GUI_UNCHECKED) = $GUI_UNCHECKED Then
                    $Inventory = _FileListToArray_Recursive(GUICtrlRead($Input2), $ext[$x], 1, 0, True)
                        If @Error=4 Then MsgBox (48,"Error","No "&$ext&" Files Found.", 5)
                ElseIf BitAND(GUICtrlRead($Checkbox_1), $GUI_UNCHECKED) = $GUI_UNCHECKED And BitAND(GUICtrlRead($Checkbox_2), $GUI_CHECKED) = $GUI_CHECKED Then
                    $Inventory = _FileListToArray_Recursive(GUICtrlRead($Input2), $ext[$x], 1, 2, False)
                        If @Error=4 Then MsgBox (48,"Error","No "&$ext&" Files Found.", 5)
                Else
                    $Inventory = _FileListToArray_Recursive(GUICtrlRead($Input2), $ext[$x], 1, 0, False)
                        If @Error=4 Then MsgBox (48,"Error","No "&$ext&" Files Found.", 5)
                    EndIf
                $aText = FileOpen($Text, 1)
                _FileWriteFromArray($aText, $Inventory, 1)
                FileClose($aText)
            Next
            GUICtrlSetData($Label_1, "Done")
            GUICtrlSetFont (-1, 10, 600)
            GUICtrlSetColor(-1, 32768)
            Sleep(2000)
            $CountLines = (_FileCountLines($Text))
            If $CountLines > 0 Then
                MsgBox(1, "Info", "Number of file(s) in folder(s): " & $Countlines & @CRLF & "List saved at: " & $Text, 8)
                Run("notepad.exe " & $Text)
            EndIf
        Case $msg = $Browse_1
            $temppath = FileSelectFolder("Save File Where", "", 1, @ScriptDir)
            GUICtrlSetData($Input1, $temppath)
        Case $msg = $Browse_2
            $temppath = FileSelectFolder("Choose a folder to search.", "", 1, @ScriptDir)
            GUICtrlSetData($Input2, $temppath)
    EndSelect
Wend

Func _FileListToArray_Recursive($sPath, $sFilter = "*", $iRetItemType = 0, $iRetPathType = 0, $bRecursive = False)
    Local $sRet = "", $sRetPath = ""
    $sPath = StringRegExpReplace($sPath, "[\\/]+\z", "")
    If Not FileExists($sPath) Then Return SetError(1, 1, "")
    If StringRegExp($sFilter, "[\\/ :> <\|]|(?s)\A\s*\z") Then Return SetError(2, 2, "")
    $sPath &= "\|"
    $sOrigPathLen = StringLen($sPath) - 1
    While $sPath
        $sCurrPathLen = StringInStr($sPath, "|") - 1
        $sCurrPath = StringLeft($sPath, $sCurrPathLen)
        $Search = FileFindFirstFile($sCurrPath & $sFilter)
        If @error Then
            $sPath = StringTrimLeft($sPath, $sCurrPathLen + 1)
            ContinueLoop
        EndIf
        Switch $iRetPathType
            Case 1 ; relative path
                $sRetPath = StringTrimLeft($sCurrPath, $sOrigPathLen)
            Case 2 ; full path
                $sRetPath = $sCurrPath
        EndSwitch
        While 1
            $File = FileFindNextFile($Search)
            If @error Then ExitLoop
            If ($iRetItemType + @extended = 2) Then ContinueLoop
            $sRet &= $sRetPath & $File & "|"
        WEnd
        FileClose($Search)
        If $bRecursive Then
            $hSearch = FileFindFirstFile($sCurrPath & "*")
            While 1
                $File = FileFindNextFile($hSearch)
                If @error Then ExitLoop
                If @extended Then $sPath &= $sCurrPath & $File & "\|"
            WEnd
            FileClose($hSearch)
        EndIf
        $sPath = StringTrimLeft($sPath, $sCurrPathLen + 1)
    WEnd
    If Not $sRet Then Return SetError(4, 4, "")
    Return StringSplit(StringTrimRight($sRet, 1), "|")
EndFunc   ;==> Melba23's _FileListToArray_Recursive
Solo tienes que adaptarlo para las búsquedas en páginas web y ya está.

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
avechuche
Hacker del Foro
Mensajes: 188
Registrado: 13 Ago 2009, 09:53

Re: Problema con recursividad

Mensaje por avechuche »

Grandioso! Viene complicado el tema, pero vamos a ver que podemos hacer! :)
Responder