Ordner in einer bestimmten Verzeichnisebenentiefe relativ zum Startordner ermitteln

    • Offizieller Beitrag

    Hi,
    vielleich hat noch wer Verwendung dafür.
    Mit der Funktion lassen sich Ordnernamen (oder kpl. Pfade) in relativer Tiefe zum Startordner ausgeben.
    Dazu wird ab Startordner rekursiv bis zur angegebenen Tiefe nach allen Verzeichnissen gesucht und die Ordner der letzten Ebene werden ausgegeben. Wahlweise wird der kpl. Pfad oder nur der Ordnername zurückgegeben.

    _GetFolderInRelativeDepth
    [autoit]

    #Region - TimeStamp
    ; 2012-05-20 20:17:50 v 0.1
    #EndRegion - TimeStamp

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

    ;===============================================================================
    ; Function Name....: _GetFolderInRelativeDepth
    ; Description......: Gibt alle Ordner (kpl. Pfade, od. nur Ordnername) in relativer Tiefe zum übergebenen Ordner zurück
    ; Parameter(s).....: $_sRootFolder Pfad unterhalb dem gesucht werden soll
    ; .................: $_iDepth Pfadebene unterhalb des Startordners
    ; .................: $fFullPath 1=Rückgabe der kpl. Ordnerpfade (Standard), 0=nur Ordnernamen
    ; Return Value(s)..: Erfolg Array mit den Ordner(Pfaden) der Ebene
    ; .................: Fehler 0, @error=1 (keine Ordner in dieser Ebene)
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _GetFolderInRelativeDepth($_sRootFolder, $_iDepth, $fFullPath=1)
    Local $sFound, $hSearch = FileFindFirstFile($_sRootFolder & '\*.*'), $iRow = $_iDepth-1
    If $_iDepth < 2 Then $iRow = 2
    Local $aFolder[$iRow][2] = [[1]], $sOut = '', $iCurrDepth = 0, $i
    While True
    $sFound = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    If StringInStr(FileGetAttrib($sFound), 'D') Then
    If $_iDepth = 1 Then
    If $fFullPath Then
    $sOut &= $_sRootFolder & '\' & $sFound & Chr(0)
    Else
    $sOut &= $sFound & Chr(0)
    EndIf
    Else
    ReDim $aFolder[$iRow][$aFolder[$iCurrDepth][0] +1]
    $aFolder[$iCurrDepth][0] += 1 ; == UBound in dieser Zeile
    $aFolder[$iCurrDepth][$aFolder[$iCurrDepth][0] -1] = $_sRootFolder & '\' & $sFound
    EndIf
    EndIf
    WEnd
    If $_iDepth = 1 Then
    If $sOut = '' Then Return SetError(1,0,0)
    Return StringSplit(StringTrimRight($sOut, 1), Chr(0))
    EndIf
    For $i = 0 To UBound($aFolder) -2 ; == Ordnerebene über Zieltiefe
    For $j = 0 To UBound($aFolder,2) -1
    If $aFolder[$i][$j] = '' Then ExitLoop
    $hSearch = FileFindFirstFile($aFolder[$i][$j] & '\*.*')
    While True
    $sFound = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    If StringInStr(FileGetAttrib($aFolder[$i][$j] & '\' & $sFound), 'D') Then
    If $aFolder[$i][0] = UBound($aFolder,2) Then
    ReDim $aFolder[$iRow][$aFolder[$i][0] +1]
    $aFolder[$i][0] += 1
    EndIf
    EndIf
    WEnd
    Next
    Next
    $i = UBound($aFolder) -1
    For $j = 0 To UBound($aFolder,2) -1
    If $aFolder[$i][$j] = '' Then ExitLoop
    $hSearch = FileFindFirstFile($aFolder[$i][$j] & '\*.*')
    While True
    $sFound = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    If StringInStr(FileGetAttrib($aFolder[$i][$j] & '\' & $sFound), 'D') Then
    If $fFullPath Then
    $sOut &= $aFolder[$i][$j] & '\' & $sFound & Chr(0)
    Else
    $sOut &= $sFound & Chr(0)
    EndIf
    EndIf
    WEnd
    Next
    If $sOut = '' Then Return SetError(1,0,0)
    Return StringSplit(StringTrimRight($sOut, 1), Chr(0))
    EndFunc ;==>_GetFolderInRelativeDepth

    [/autoit]
  • Hallo zusammen,

    von über 30 die Dein Script angeshen haben, bin ich woll der Duemmste.

    Ich bring die function nicht zum laufen.

    Vielleicht koenntest Du ein Beispiel anhaengen.

    z.B. Ein Teil des System- Ordners.


    Danke, euer Cubaner

    • Offizieller Beitrag

    Also mal etwas genauer erklärt:

    Du hast einen Startpfad und möchtest alle Ordner die 2 Ebenen unterhalb dieses Pfades liegen auslesen.
    z.B. folgende Struktur:

    Code
    STARTPFAD         EBENE_1         EBENE_2
    C:\Projekte\      Projekt1\       Source1
                                      Images1
    C:\Projekte\      Projekt2\       Source2
                                      Images2
    [autoit]

    $aFolder = _GetFolderInRelativeDepth("C:\Projekte", 2)
    ; Inhalt $aFolder:
    ; Source1, Images1, Source2, Images2

    [/autoit]

    Gewöhnlich legt man Dateien zu einem bestimmten Programm in Verzeichnisbäumen ab. Wenn du aber nach Dateien suchst, hangelst du dich immer durch einen gesamten Zweig, kehrst dann zurück zum Root und suchst im nächsten Zweig. Hiermit erhälst du sofort alle Ordner einer bestimmten Tiefe und kannst dann ganz gezielt dort suchen.
    Als andere Einsatzmöglichkeit wäre auch das Zusammenstellen von Ordnern/Dateien für Datensicherungen denkbar, da liegen die Userdaten oft auch unterhalb eines Root in bestimmter Tiefe.