Autore Topic: _FileListToArrayEx (list directory, subdirectory, and files)  (Letto 6568 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline OnePiece

  • Eng2ita Friends
  • **
  • Post: 6.114
  • Karma: -3277
Ragazzi niente di che solo cosi per hoby diciamo ecco mi sono messo aggiornare un del function del autoit il _FileListToArray, per farlo supportare la ricerca anche in subdirectory, dire il vero ci o messo quasi 4 giorni era come un indovinello ma in fine ecco e in fine contenti, e uscito un codice davvero pulito con solo 22 line aggiunte a quello originale

Il _FileListToArrayEx lavora quasi 20% piu veloce del (cmd.exe Dir)
Codice: [Seleziona]
#include <Constants.au3>
$foo = Run(@ComSpec & " /c " & "DIR " & '"' & @windowsdir & '"' & "  /A /b /s /ong", "", @SW_HIDE, $STDOUT_CHILD)
While 1
    $line &= StdoutRead($foo)
    If @error Then ExitLoop
Wend

http://www.autoitscript.com/autoit3/docs/libfunctions/_FileListToArray.htm
$iFlag = 4 Cercare anche in sotto direttori
$iFlag = 8 Return Full Path

Codice: [Seleziona]
#include <Array.au3>

Global $a1, $b1
$a1 = TimerInit()
$b1 = _FileListToArrayEx(@WindowsDir, "*", 12)
;$b1 = _FileListToArrayEx(@UserProfileDir & "\Pictures", "*.png|*.jpg|*.bmp")
$a1 = TimerDiff($a1)
_ArrayDisplay($b1, $a1)

; #FUNCTION# ========================================================================================================================
; Name...........: _FileListToArray
; Description ...: Lists files and\or folders in a specified path (Similar to using Dir with the /B Switch)
; Syntax.........: _FileListToArray($sPath[, $sFilter = "*"[, $iFlag = 0]])
; Parameters ....: $sPath   - Path to generate filelist for.
;                 $sFilter - Optional the filter to use, default is *. (Multiple filter groups such as "All "*.png|*.jpg|*.bmp") Search the Autoit3 helpfile for the word "WildCards" For details.
;                 $iFlag   - Optional: specifies whether to return files folders or both Or Full Path (add the flags together for multiple operations):
;                 |$iFlag = 0 (Default) Return both files and folders
;                 |$iFlag = 1 Return files only
;                 |$iFlag = 2 Return Folders only
;                 |$iFlag = 4 Search subdirectory
;                 |$iFlag = 8 Return Full Path
; Return values .: @Error - 1 = Path not found or invalid
;                 |2 = Invalid $sFilter
;                 |3 = Invalid $iFlag
;                 |4 = No File(s) Found
; Author ........: SolidSnake <MetalGX91 at GMail dot com>
; Modified.......:
; Remarks .......: The array returned is one-dimensional and is made up as follows:
;                               $array[0] = Number of Files\Folders returned
;                               $array[1] = 1st File\Folder
;                               $array[2] = 2nd File\Folder
;                               $array[3] = 3rd File\Folder
;                               $array[n] = nth File\Folder
; Related .......:
; Link ..........:
; Example .......: Yes
; Note ..........: Special Thanks to Helge and Layer for help with the $iFlag update speed optimization by code65536, pdaughe
;                 Update By DXRW4E
; ===================================================================================================================================
Func _FileListToArrayEx($sPath, $sFilter = "*", $iFlag = 0)
    Local $hSearch, $sFile, $sFileList, $iFlags = StringReplace(BitAND($iFlag, 1) + BitAND($iFlag, 2), "3", "0"), $sSDir = BitAND($iFlag, 4), $FPath = "", $sDelim = "|", $sSDirFTMP = $sFilter
    $sPath = StringRegExpReplace($sPath, "[\\/]+\z", "") & "\" ; ensure single trailing backslash
    If Not FileExists($sPath) Then Return SetError(1, 1, "")
    If BitAND($iFlag, 8) Then $FPath = $sPath
    If StringRegExp($sFilter, "[\\/:><]|(?s)\A\s*\z") Then Return SetError(2, 2, "")
    If Not ($iFlags = 0 Or $iFlags = 1 Or $iFlags = 2 Or $sSDir = 4 Or $FPath <> "") Then Return SetError(3, 3, "")
    $hSearch = FileFindFirstFile($sPath & "*")
    If @error Then Return SetError(4, 4, "")
    Local $hWSearch = $hSearch, $hWSTMP = $hSearch, $SearchWD, $sSDirF[3] = [0, StringReplace($sSDirFTMP, "*", ""), "(?i)(" & StringRegExpReplace(StringRegExpReplace(StringRegExpReplace(StringRegExpReplace(StringRegExpReplace(StringRegExpReplace("|" & $sSDirFTMP & "|", '\|\h*\|[\|\h]*', "\|"), '[\^\$\(\)\+\[\]\{\}\,\.\=]', "\\$0"), "\|([^\*])", "\|^$1"), "([^\*])\|", "$1\$\|"), '\*', ".*"), '^\||\|$', "") & ")"]
    While 1
        $sFile = FileFindNextFile($hWSearch)
        If @error Then
            If $hWSearch = $hSearch Then ExitLoop
            FileClose($hWSearch)
            $hWSearch -= 1
            $SearchWD = StringLeft($SearchWD, StringInStr(StringTrimRight($SearchWD, 1), "\", 1, -1))
        ElseIf $sSDir Then
            $sSDirF[0] = @extended
            If ($iFlags + $sSDirF[0] <> 2) Then
                If $sSDirF[1] Then
                    If StringRegExp($sFile, $sSDirF[2]) Then $sFileList &= $sDelim & $FPath & $SearchWD & $sFile
                Else
                    $sFileList &= $sDelim & $FPath & $SearchWD & $sFile
                EndIf
            EndIf
            If Not $sSDirF[0] Then ContinueLoop
            $hWSTMP = FileFindFirstFile($sPath & $SearchWD & $sFile & "\*")
            If $hWSTMP = -1 Then ContinueLoop
            $hWSearch = $hWSTMP
            $SearchWD &= $sFile & "\"
        Else
            If ($iFlags + @extended = 2) Or StringRegExp($sFile, $sSDirF[2]) = 0 Then ContinueLoop
            $sFileList &= $sDelim & $FPath & $sFile
        EndIf
    WEnd
    FileClose($hSearch)
    If Not $sFileList Then Return SetError(4, 4, "")
    Return StringSplit(StringTrimLeft($sFileList, 1), "|")
EndFunc


Ciao a  tutti.
« Ultima modifica: 07/04/2012, 12:38 da OnePiece »
   

Offline Mr.X

  • Eng2ita Staff
  • ***
  • Post: 616
  • Karma: 77
Non conosco i motivi per cui hai scelto _FileListToArrayEx ..... però RecFileListToArray sembra migliore e, siccome a te interessa la velocità ($a1 = TimerInit()........$a1 = TimerDiff($a1)) questo che ti ho indicato è rapidissimo...  ;)
Lo trovi qui: http://www.autoitscript.com/forum/topic/126198-recfilelisttoarray-new-version-22-may-11/
E poi viene aggiornato spesso ... tutti gli altri sono un po' vecchiotti... ma sempre molto validi intendiamoci ehh !
Un'altra valida alternativa è _FileListToArrayNT7
Io non uso nessuno dei due... poi valuterò se cambiare o no.... quello che mi rallenta da matti lo script è _GUICtrlTreeView_SetIcon ma ce l'ho lasciato perchè è carino  :)

Offline OnePiece

  • Eng2ita Friends
  • **
  • Post: 6.114
  • Karma: -3277
Ciao MISTER X ®, non ti voglio contraddire come si dice, mah ehh siamo quasi anni luce lontano ehhhhh  ;D  ;), cosa voglio dire con questo il RecFileListToArray prende in modo e non buona buona riguardo lista che ritorna in 14 e di più di secondi il @windowsdir ehhhhhhhh, il mio la prende in circa 9 secondi  ;) ;) ;) e quasi in modo perfetto  ;) (più meglio del CMD.exe Dir che lavora su circa 12 secondi), dopo solo per fare ArraySort non ai idea che tempo li serve al RecFileListToArray hmmmmmm (minuti e chi sa altro ehhhh) quindi siamo anni luce lontano davvero, questo era riguardo velocità

riguardo codice stesso e stato usato quello di default di autoit ehhhhhhh, solo 18 line script originale, il secondo fato da noi e solo 40 line eh, in altri 22 line risolto il dilemma (in autoit forum moderatori stessi consigliano il primo esempio postato sopra, solo perché questo codice postato da me sopra mancava fino a adesso  ;) ;)) che molti altri come il caso del RecFileListToArray usano molto molto più line ehhhhhh (e non fanno proprio proprio quello che serve davvero li,o dire piu bene usano strade alternativi da quelli originali per riuscire fare una cosa, cosi in fine la cosa prende moltissimo più tmepo e non esce in fine come si deve proprio  ;)), in povere parole abiamo aggiunto al codice originale 22 line, e aggiunto un altro $iFlag, più perfetto di cosi credo non ce

dopo non dimenticare non si parla di bravura ci manterrebbe ehhhhhhh siamo imparando leggendo in autoit forum cosi non si parla proprio chi e più bravo li ehhhhhh (come detto ci manterrebbe proprio dopo ehhh  ;D ;D ;D, io personalmente mi ritengo davvero un povero dilettante riguardo AutoIt ehhhhh), ma volevo dire che codice e uno che serve aggiornarlo 1000 volte ehhhhhhhh, ricordi i function di autoit di default succede molto molto raramente essere aggiornati ehhhhhhh, e solo in casi quando cambia codice base di autoit e certi function si aggiornano per adattarli meglio al nuovo codice ehhhhh

comunque e sempre questione di gusti ehhhhhhhh, cosi uno usa sempre quello che personalmente piace ect ect, ma riguardo il codici steso per prendere la lista del file/directory, credimi il nostro codice e unico (non esiste davvero nessun paragone con le altre alternativi almeno per quelli che o visto io fino a adesso, su-serio e davvero un capo lavoro (per non fraintendersi,  non il lavoro ;D ;D ;D, mi riferisco al codice stesso) riguardo il modo di prendere la lista del direttori/file in autoit) e a risolto un dilemma che in autoit forum e da anni che li girano attorno MPV e Moderatori stessi http://www.autoitscript.com/forum/topic/33930-another-filelisttoarray/page__hl___filelisttoarrayex

riguardo _FileListToArrayEx, hm scelto quello nome perché fato riferimento al Moderatori e MPV stesi in autoit forum, quando basano un codice in un altro o fanno una cosa alternativa a un codice già esistente oppure quando migliorano un function già esistente usano sempre questi tipi di nomi


Ciao.
« Ultima modifica: 28/07/2011, 13:52 da OnePiece »
   

Offline Mr.X

  • Eng2ita Staff
  • ***
  • Post: 616
  • Karma: 77
Non metto in dubbio quello che dici OnePiece  ;) del resto io mi baso sui test fatti diverso tempo fa dalle persone del forum di Autoit (ne parlavano molto bene... era uno dei migliori) e neppure ho visto bene il codice più di tanto: quale meglio e quale peggio.
Anzi... ti dirò: lo sto guardando per bene adesso  e sembra davvero ben fatto: possiede anche il filtro per le estensioni  ;D
Tanto lo sappiamo benissimo: la funzione UDF inserita di default  _FileListToArray  è insufficiente per certe cose che dobbiamo fare noi, dovrebbero inserire degli UDF più efficienti, altrimenti bisogna fare i test proprio come fai te per scovare una UDF migliore  ;)

Offline OnePiece

  • Eng2ita Friends
  • **
  • Post: 6.114
  • Karma: -3277
Riguardo il filtro ne basta e avanza solo UNO  ;) il $iFlag del function originale  ;) ;) ;), e cosi da per tutto (in tutti function base che usano tutti linguaggi, o dire piu bene quelli del MSDN  ;D ;D ;D) basta un filtro, invece i codici alternativi ne usano 2 3 4 hmmmmmmmm non lo capito il perché, ma come detto senza giudicare nessuno, sono codici alternativi e non ben fati e non basati in codici PURE puliti  ;)

Riguardo UDF del autoit, o dei dubbi che non sono sempre  sempre il massimo (ma il esempio che danno e davvero senza paragoni, di dicano in 10 line tutto quello che vuoi sapere in caso che vuoi sviluppare qualche cosa li), perché in generale le UDF si fanno dai gente molto molto molto brava ehhhhhh, ma dal gente di terze parti, cosi il loro scopo e mostrare che fa autoit, e una cosa di supporto e basta (dire bene per dare esempi, e dopo utente va al infinito li se vole ehhhhhh), di qui riguardo Array non solo _FileListToArray era incompleto ma quasi tutta la suite, il Sort e un rottura prende molto molto tempo e non e efficiente come serve, ci confonde tra caratteri e numeri ect ect

comunque mi sono messo fare quella cosa, di più per curiosità (sfida personale forse riguardo i nervi ehhh) riguardo FileFindNextFile & FileFindFirstFile, che sono base in tutte lingue di programmazione credo, e con loro prendere la lista li, e come detto visto che microsoft li usa ehhhhhhh non cera dubbio con quelli si poteva fare e come ehhhh, ma era come un indovinello che ti rompeva i nervi, ma come ai visto in fine ce la biamo fato  ;) ;)

ahh visto che ci siamo il ArraySort, e stato migliorato in versioni BETA www.eng2ita.net/forum/index.php?action=dlattach;topic=7526.0;attach=5024

Ciao.
« Ultima modifica: 28/07/2011, 16:19 da OnePiece »
   

Offline OnePiece

  • Eng2ita Friends
  • **
  • Post: 6.114
  • Karma: -3277
Aggiornato primo post, riparato una problema che riguardava il filter

Ciao a tutti.
   

Offline OnePiece

  • Eng2ita Friends
  • **
  • Post: 6.114
  • Karma: -3277
Aggiornato, per di piu guardate il primo post

Ciao a tutti.