Rekursive Datei/Ordner Auflistung per Objekt

  • hm ich komm mir grad bissle blöd vor...

    ich ruf die funktion so auf:

    [autoit]


    $time = timerinit()
    $folders = _GetFilesFolder_Rekursiv(@scriptdir,"poker")
    $erg = ""
    for $i = 1 to $folders[0]
    $erg = $erg&@crlf&$folders[$i]
    Next
    $time = TimerDiff($time)
    FileWrite("log.txt",$time&@crlf&$erg)

    [/autoit]

    aber als ergebnis landet das hier im log:

    er gibt mir jeden pfad aus, immer erst oberordner dann unterordner...

    dabei wollt ich eigendlich nur den pfad zu einer datei in deren name "poker" vorkommt :D
    was hab ich falsch verstanden?

    • Offizieller Beitrag
    Zitat

    Ihr übergebt Pfad (für aktuellen Pfad kann '.' und für übergeordneten Pfad kann '..' verwendet werden), Dateierweiterung ('*' oder -1 für alle[Standard]) und ein OrdnerFlag (-1 Datei+Ordner[Standard], 0 nur Dateien, 1 nur Ordner).


    Was von den erforderlichen Parametern soll bitte "poker" sein? ;)

  • oh :)
    dateierweiterung , wirklich nur erweiterung? ;P mist

    poker war einfach ein string , des sollte alle files auflisten mit "poker" im namen

    hm mal gucken wie man das dann umsetzen kann,...


    aber dennoch ist es ein bug oder?

    poker gibts als dateierweiterung ja nicht, und dennoch gilt jeder pfad als ergebnis ;)

  • hey, ihr 2 ...
    das sind beides sehr nette möglichkeiten, die ordner aufzulisten.
    leider habe ich mich noch nicht für eine entschieden, aus dem grund, da mir noch diverse angaben fehlen (wie bei dir).
    jetzt habe ich nur kein plan, wo ich das einbauen müsste (z. B. größe, zeit, usw).

    kann mir wer helfen und dürfte ich eure udf für meine zwecke anpassen ?

  • Hab mir mal kurz was erlaubt^^

    Ich hab bei deiner Funktion noch hinzugefügt, dass man mehrere Dateiendungen angeben kann (durch "|" getrennt)

    vl kann es jemand brauchen:

    Spoiler anzeigen
    [autoit]


    ;==================================================================================================
    ; Function Name: _GetFilesFolder_Rekursiv($sPath [, $sExt='*' [, $iDir=-1 [, $iRetType=0 ,[$sDelim='0']]]])
    ; Description: Rekursive Auflistung von Dateien und/oder Ordnern
    ; Parameter(s): $sPath der Basispfad für die Auflistung ('.' -aktueller Pfad, '..' -Parentpfad)
    ; $sExt Erweiterung für Dateiauswahl '*' oder -1 für alle (Standard)
    ; $iDir -1 Dateien+Ordner(Standard), 0 nur Dateien, 1 nur Ordner
    ; optional: $iRetType 0 gibt Array, 1 gibt String zurück
    ; optional: $sDelim legt Trennzeichen für Stringrückgabe fest
    ; 0 -@CRLF (Standard) 1 -@CR 2 -@LF 3 -';' 4 -'|'
    ; Return Value(s): Array (Standard) od. String mit den gefundenen Pfaden der Dateien und/oder Ordner
    ; Array[0] enthält die Anzahl der gefundenen Dateien/Ordner
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ; Modified: oetzn
    ;==================================================================================================
    Func _GetFilesFolder_Rekursiv($sPath, $sExt = '*', $iDir = -1, $iRetType = 0, $sDelim = '0')
    Global $oFSO = ObjCreate('Scripting.FileSystemObject')
    Global $strFiles = ''
    Switch $sDelim
    Case '1'
    $sDelim = @CR
    Case '2'
    $sDelim = @LF
    Case '3'
    $sDelim = ';'
    Case '4'
    $sDelim = '|'
    Case Else
    $sDelim = @CRLF
    EndSwitch
    If ($iRetType < 0) Or ($iRetType > 1) Then $iRetType = 0
    If $sExt = -1 Then $sExt = '*'
    If ($iDir < -1) Or ($iDir > 1) Then $iDir = -1
    _ShowSubFolders($oFSO.GetFolder($sPath), $sExt, $iDir, $sDelim)
    If $iRetType = 0 Then
    Local $aOut
    $aOut = StringSplit(StringTrimRight($strFiles, StringLen($sDelim)), $sDelim, 1)
    If $aOut[1] = '' Then
    ReDim $aOut[1]
    $aOut[0] = 0
    EndIf
    Return $aOut
    Else
    Return StringTrimRight($strFiles, StringLen($sDelim))
    EndIf
    EndFunc ;==>_GetFilesFolder_Rekursiv

    [/autoit] [autoit][/autoit] [autoit]

    Func _ShowSubFolders($Folder, $Ext = '*', $Dir = -1, $Delim = @CRLF)
    $aExt = StringSplit($Ext, "|", 2) ;von mir eingefügt
    ;~ _ArrayDisplay($aExt)
    If Not IsDeclared("strFiles") Then Global $strFiles = ''
    If ($Dir = -1) Or ($Dir = 0) Then
    For $file In $Folder.Files
    If $Ext <> '*' Then
    For $i = 0 To UBound($aExt) - 1 ;von mir eingefügt
    If StringRight($file.Name, StringLen($aExt[$i])) = $aExt[$i] Then _ ; $Ext in $Ext[$i] geändert
    $strFiles &= $file.Path & $Delim
    Next ;von mir eingefügt
    Else
    $strFiles &= $file.Path & $Delim
    EndIf
    Next
    EndIf
    For $Subfolder In $Folder.SubFolders
    If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim
    _ShowSubFolders($Subfolder, $Ext, $Dir, $Delim)
    Next
    EndFunc ;==>_ShowSubFolders

    [/autoit]

    Ich hoffe ich verstoß hier nicht gegen irgendwelche Regeln ^^

  • Hallo,

    ich weiß, das Thema ist nicht mehr das aktuellste, aber habe trotzdem eine Frage dazu.

    Ist es möglich, die Funktion so anzupassen, dass ich die gefundenen Dateinamen samt Pfad immer einzeln ausgebe? Ich muss die einzelnen Dateien in einem Programm noch bearbeiten, da könnte man dann eine Schleife konstruieren und ich wäre zufrieden.

    Gruß
    Bad_Rockk

  • Warum, Du brauchst doch die Funktion nur 1x aufrufen und in einem Array (Standard) speichern.

    Nun durchläufst du dein Array von 1 bis $array[0] und führst Deinen Befehl aus. Oder hab ich Dich jetzt falsch verstanden ?

    [autoit]

    $array = _GetFilesFolder_Rekursiv("C:\Programme", "txt")
    For $i = 1 To $array[0]
    ;Dein Aufruf mit $array[$i] als Parameter
    Next

    [/autoit]

    Warum willst Du hierfür die Funktion ändern ?

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Hallo Micha,

    da hast du recht. Aber manchmal sieht man den Wald vor lauter Bäumen nicht mehr.

    Geht natürlich genauso und ich muss nicht an der Funktion rumbasteln.

    Dank dir.

    Gruß Bad_Rockk

  • Hallo ich nutze die Funktion auch immer wieder gerne, nun habe ich aber den Wunsch Ordner auszuschliessen.
    Wie mache ich das am Besten, ich habe schon an div. Stellen versucht mir den Ordnernamen via msgbox anzeigen
    zu lassen. Vermutlich ist es aber da schon kein String mehr, da die Box immer leer ist.

    Also Ordnerstruktur

    d:\Ordner_zum_durchsuchen\
    d:\Ordner_zum_durchsuchen\aaaa
    d:\Ordner_zum_durchsuchen\bbbb
    d:\Ordner_zum_durchsuchen\ccccc
    d:\Ordner_zum_durchsuchen\ddd
    d:\Ordner_zum_durchsuchen\eeee
    d:\Ordner_zum_durchsuchen\ffffff
    d:\Ordner_zum_durchsuchen\ggggg
    d:\Ordner_zum_durchsuchen\hier_ gibt_es_viele_Dateien_aber_nicht_die_gesuchte_Endung
    d:\Ordner_zum_durchsuchen\iiii
    d:\Ordner_zum_durchsuchen\hier_auch_nicht
    d:\Ordner_zum_durchsuchen\kk

    Wo muss ich eingreifen um "d:\Ordner_zum_durchsuchen\" zu durchsuchen aber eben
    "d:\Ordner_zum_durchsuchen\hier_ gibt_es_viele_Dateien_aber_nicht_die_gesuchte_Endung" &
    "d:\Ordner_zum_durchsuchen\hier_auch_nicht" nicht.

    Eine Lösung wäre alle Topordner zuerst zu ermitteln, die dann in einer Schleife abarbeiten zu lassen und dabei zu filtern, ich finde die Lösung aber nicht so schön. Also ein Teil des Scriptes vorab ausführen.

    P.S.: Der Aufruf der Funktion sieht so aus:

    [autoit]

    _GetFilesFolder_Rekursiv('L:\Installationen\Setup-MSI\','msp',0)

    [/autoit]


    Also nur Dateien ohne sep. Ordner, liegt es daran, das sie MsgBox leer bleibt? :)

    Gruß Dietmar

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

    2 Mal editiert, zuletzt von Dietmar (31. Januar 2012 um 11:25)

    • Offizieller Beitrag

    Bau dir am einfachsten direkt in die Funktion deine Ausschlußordner ein:

    [autoit]

    Func _ShowSubFolders($Folder, $Ext='*', $Dir=-1, $Delim=@CRLF)
    If Not IsDeclared("strFiles") Then Global $strFiles = ''
    If ($Dir = -1) Or ($Dir = 0) Then
    For $file In $Folder.Files
    If $Ext <> '*' Then
    If StringRight($file.Name, StringLen($Ext)) = $Ext Then _
    $strFiles &= $file.Path & $Delim
    Else
    $strFiles &= $file.Path & $Delim
    EndIf
    Next
    EndIf
    For $Subfolder In $Folder.SubFolders
    ; ================================= Hier die auszuschließenden Ordner einbinden ===================================================================
    If $Folder = "Dein_Start_Pfad" And ($Subfolder = "UnterOrdner1_zum_Ausschluß" Or $Subfolder = "UnterOrdner2_zum_Ausschluß" .....) Then ContinueLoop
    ; ==================================================================================================================================================
    If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim
    _ShowSubFolders($Subfolder, $Ext, $Dir, $Delim)
    Next
    EndFunc

    [/autoit]
  • BugFix

    Ich habe mal Deine Funktionen angepasst. Wenn Du schon das FileSystemObject verwendest, warum benutzt Du dann nicht die GetExtensionName-Methode. Außerdem soll auf die Verwendung von globalen Variablen verzichtet werden. Diese habe ich aus Deinem Skript gelöscht. Deine Unterprogramm _ShowSubFolders gibt jetzt etwas zurück. Der Rückgabewert kann nun weiterverarbeitet werden.

    Spoiler anzeigen
    [autoit]

    ;==================================================================================================
    ; Function Name: _GetFilesFolder_Rekursiv($sPath [, $sExt='*' [, $iDir=-1 [, $iRetType=0 ,[$sDelim='0']]]])
    ; Description: Rekursive Auflistung von Dateien und/oder Ordnern
    ; Parameter(s): $sPath der Basispfad für die Auflistung ('.' -aktueller Pfad, '..' -Parentpfad)
    ; $sExt Erweiterung für Dateiauswahl '*' oder -1 für alle (Standard)
    ; $iDir -1 Dateien+Ordner(Standard), 0 nur Dateien, 1 nur Ordner
    ; optional: $iRetType 0 gibt Array, 1 gibt String zurück
    ; optional: $sDelim legt Trennzeichen für Stringrückgabe fest
    ; 0 -@CRLF (Standard) 1 -@CR 2 -@LF 3 -';' 4 -'|'
    ; Return Value(s): Array (Standard) od. String mit den gefundenen Pfaden der Dateien und/oder Ordner
    ; Array[0] enthält die Anzahl der gefundenen Dateien/Ordner
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    Func _GetFilesFolder_Rekursiv($sPath, $sExt = '*', $iDir = -1, $iRetType = 0, $sDelim = '0')
    ;Global $oFSO = ObjCreate('Scripting.FileSystemObject')
    Local $oFSO = ObjCreate('Scripting.FileSystemObject')
    ;Global $strFiles = ''
    Switch $sDelim
    Case '1'
    $sDelim = @CR
    Case '2'
    $sDelim = @LF
    Case '3'
    $sDelim = ';'
    Case '4'
    $sDelim = '|'
    Case Else
    $sDelim = @CRLF
    EndSwitch
    If ($iRetType < 0) Or ($iRetType > 1) Then $iRetType = 0
    If $sExt = -1 Then $sExt = '*'
    If ($iDir < -1) Or ($iDir > 1) Then $iDir = -1
    $out = _ShowSubFolders($oFSO.GetFolder($sPath), $sExt, $iDir, $sDelim)
    If $iRetType = 0 Then
    Local $aOut
    $aOut = StringSplit(StringTrimRight($out, StringLen($sDelim)), $sDelim, 1)
    If $aOut[1] = '' Then
    ReDim $aOut[1]
    $aOut[0] = 0
    EndIf
    Return $aOut
    Else
    Return StringTrimRight($out, StringLen($sDelim))
    EndIf
    EndFunc ;==>_GetFilesFolder_Rekursiv

    [/autoit] [autoit][/autoit] [autoit]

    Func _ShowSubFolders($Folder, $Ext = '*', $Dir = -1, $Delim = @CRLF)
    Local Static $retVal
    If ($Dir = -1) Or ($Dir = 0) Then
    For $file In $Folder.Files
    If $Ext <> '*' Then
    ;If StringRight($file.Name, StringLen($Ext)) = $Ext Then _
    ; $strFiles &= $file.Path & $Delim
    Local $oFSO = ObjCreate('Scripting.FileSystemObject')
    If $oFSO.GetExtensionName($file.Path) == $Ext Then
    $retVal &= $file.Path & $Delim
    EndIf
    Else
    $retVal &= $file.Path & $Delim
    EndIf
    Next
    EndIf
    For $Subfolder In $Folder.SubFolders
    If ($Dir = -1) Or ($Dir = 1) Then $retVal &= $Subfolder.Path & '\' & $Delim
    _ShowSubFolders($Subfolder, $Ext, $Dir, $Delim)
    Next
    Return $retVal
    EndFunc ;==>_ShowSubFolders

    [/autoit]
  • [autoit]

    For $Subfolder In $Folder.SubFolders
    ; ================================= Hier die auszuschließenden Ordner einbinden ===================================================================
    If $Folder = "Dein_Start_Pfad" And ($Subfolder = "UnterOrdner1_zum_Ausschluß" Or $Subfolder = "UnterOrdner2_zum_Ausschluß" .....) Then ContinueLoop
    ; ==================================================================================================================================================
    If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim
    _ShowSubFolders($Subfolder, $Ext, $Dir, $Delim)

    [/autoit]

    klappt bei mir nicht, $Folder $SubFolder ist immer leer, aber das hier geht.

    [autoit]

    For $Subfolder In $Folder.SubFolders
    ;~ If $Folder = 'L:\Installationen\Versions\' And ($Subfolder = "0" Or $Subfolder = "All" Or $Subfolder = "Final") Then ContinueLoop
    ;~ ConsoleWrite($SubFolder)
    If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim
    ;~ ConsoleWrite($Subfolder.Path)
    If $Subfolder.Path = "L:\Installationen\Versions\0" Or $Subfolder = "Installationen\Versions\All" Or $Subfolder = "L:\Installationen\Versions\Final" Then ContinueLoop
    _ShowSubFolders($Subfolder, $Ext, $Dir, $Delim)

    [/autoit]

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

  • Ist es möglich das Array nach Datum sortiert zu erhalten? Im Objekt finde ich auf Anhieb nichts.

    Edit: Habe ich jetzt so gelöst:

    [autoit]

    $strFiles &= $file.DateCreated & "?" & $file.Path & $Delim ; Dem Dateinamen wird ein Datum vorangestellt. Trenner: '?'

    [/autoit]

    Danach den String wieder auseinandergebaut und das Array neu verpackt. Dann kann man auf- und absteigend sortieren.

    Einmal editiert, zuletzt von r0m (6. August 2013 um 13:04)