Anzahl Ordner und dateien Aufzählen...

  • Hallo,

    möchte gerne von einen Verzeichnis Ordner ordner und dateien auslesen um genau zu sein anzahl an dateien.

    Hat jemand einen tipp für mich oder beispiel?

    Danke
    SubZero

    lg SubZero ;)
    ==========================================================================

    "Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral."

    Einmal editiert, zuletzt von subzero007 (11. März 2010 um 15:25)

  • Hast du auch ein beispiel?

    lg SubZero ;)
    ==========================================================================

    "Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral."

  • Das habe ich auch gefunden ...
    habe bloss den parameter für mein vorhaben nicht gefunden ??

    lg SubZero ;)
    ==========================================================================

    "Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral."

  • Spoiler anzeigen
    [autoit]

    #include<Array.au3>
    $ret = _GetFilesFolder_Rekursiv(@TempDir, -1 , 0, 0)
    If IsArray($ret) Then
    MsgBox(0, "Rekursiv alle Dateien", $ret[0] & " Dateien gefunden")
    Else
    ConsoleWrite($ret & @CRLF)
    EndIf

    [/autoit] [autoit][/autoit] [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')
    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

    [/autoit] [autoit][/autoit] [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
    If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim
    _ShowSubFolders($Subfolder, $Ext, $Dir, $Delim)
    Next
    EndFunc

    [/autoit]

    edit: omg, das war extrem langsam

  • Spoiler anzeigen
    [autoit]

    Func _GetFileList($T_DIR, $T_MASK, $DIR_ONLY = 0)
    Dim $N_DIRNAMES[200000] ; max number of directories that can be scanned
    Local $N_DIRCOUNT = 0
    Local $N_FILE
    Local $N_SEARCH
    Local $N_TFILE
    Local $N_OFILE
    Local $T_FILENAMES
    Local $T_FILECOUNT
    Local $T_DIRCOUNT = 1
    Local $FILEMASK
    ; check Filemask \ for empty File-Array by GetDirOnly
    If $FILEMASK = "n" Then $FILEMASK = "*.no"
    ; remove the end \ If specified
    If StringRight($T_DIR, 1) = "\" Then $T_DIR = StringTrimRight($T_DIR, 1)
    $N_DIRNAMES[$T_DIRCOUNT] = $T_DIR
    ; Exit if base dir doesn't exists
    If Not FileExists($T_DIR) Then Return 0
    ; keep on looping until all directories are scanned
    While $T_DIRCOUNT > $N_DIRCOUNT
    $N_DIRCOUNT = $N_DIRCOUNT + 1
    ; find all subdirs in this directory and save them in a array
    $N_SEARCH = FileFindFirstFile($N_DIRNAMES[$N_DIRCOUNT] & "\*.*")
    While 1
    $N_FILE = FileFindNextFile($N_SEARCH)
    If @error Then ExitLoop
    ; skip these references
    If $N_FILE = "." Or $N_FILE = ".." Then ContinueLoop
    $N_TFILE = $N_DIRNAMES[$N_DIRCOUNT] & "\" & $N_FILE
    ; if Directory than add to the list of directories to be processed
    If StringInStr(FileGetAttrib($N_TFILE), "D") > 0 Then
    $T_DIRCOUNT = $T_DIRCOUNT + 1
    $N_DIRNAMES[$T_DIRCOUNT] = $N_TFILE
    EndIf
    WEnd
    FileClose($N_SEARCH) ; find all Files that mtach the MASK
    $N_SEARCH = FileFindFirstFile($N_DIRNAMES[$N_DIRCOUNT] & "\" & $T_MASK)
    If $N_SEARCH = -1 Then ContinueLoop
    While 1
    $N_FILE = FileFindNextFile($N_SEARCH)
    If @error Then ExitLoop
    ; skip these references
    If $N_FILE = "." Or $N_FILE = ".." Then ContinueLoop
    $N_TFILE = $N_DIRNAMES[$N_DIRCOUNT] & "\" & $N_FILE
    ; if Directory than add to the list of directories to be processed
    If StringInStr(FileGetAttrib($N_TFILE), "D") = 0 Then
    $T_FILENAMES = $T_FILENAMES & $N_TFILE & @CR
    $T_FILECOUNT = $T_FILECOUNT + 1
    ;MsgBox(0,'filecount ' & $T_FILECOUNT ,$N_TFILE)
    EndIf
    WEnd
    FileClose($N_SEARCH)
    WEnd
    If $DIR_ONLY = 0 Then
    $T_FILENAMES = StringTrimRight($T_FILENAMES, 1)
    $N_OFILE = StringSplit($T_FILENAMES, @CR)
    Return ($N_OFILE)
    Else
    ReDim $N_DIRNAMES[$N_DIRCOUNT + 1]
    $N_DIRNAMES[0] = $N_DIRCOUNT
    Return $N_DIRNAMES
    EndIf
    EndFunc ;==>_GetFileList

    [/autoit]

    Diese Funktion sollte das Selbe tun, weiss aber grad nicht mehr wo ich sie her habe und ob sie schneller ist.
    Greetz

    edit: oh, das langsam bezog sich ja garnicht auf die Funktion =D
    egal, man könnte ja mal einen Geschwindigkeitsvergleich durchführen..

  • Habe mal beide Funktionen gegeneinander getestet mit jeweils 10 durchläufen nacheinander, die _GetFileList ist minimal schneller,
    bei 10 durchläufen nacheinander von immer 5000 dateien ist sie gradmal 500ms schneller, also pro durchlauf ca 50ms auf 5000 dateien ;)

  • Wenn es wirklich auf die Geschwindigkeit ankommt dann wär es vielleicht besser eine Funktion speziell für diesen Fall zu verwenden.
    Die komplette Dateiliste in einem Array benötigt man hier ja nicht - warum also erstellen lassen?
    Mal ein Vorschlag:

    Spoiler anzeigen
    [autoit]

    Global $Path = @SystemDir

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

    $Files = CountAllFiles($Path, 1)
    $Folders = CountAllFiles($Path, 2)
    MsgBox(0,"Anzahl", "Dateien: " & $Files & @CRLF & "Ordner: " & $Folders)

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

    ; by AspirinJunkie
    ; benötigt .Net für Stack
    ; $Flag auf 1 für Dateien, 2 für Ordner, 3 für beide
    Func CountAllFiles($sStDir, $iFlag = 3)
    Local $cStack = ObjCreate("System.Collections.Stack")
    If @error Then Return SetError(1, 1, -1)
    Local $Counter = 0, $FFFF, $FFNF, $sDir

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

    If StringRight($sStDir, 1) = '\' Then $sStDir = StringTrimRight($sStDir, 1)
    If Not FileExists($sStDir) Then Return SetError(2, 0, "")

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

    $cStack.Push($sStDir)

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

    While $cStack.Count > 0
    $sDir = $cStack.Pop
    $FFFF = FileFindFirstFile($sDir & '\*')
    If $FFFF <> -1 Then
    Do
    $FFNF = FileFindNextFile($FFFF)
    If @error Then ExitLoop
    If @extended Then
    $cStack.Push($sDir & '\' & $FFNF)
    If BitAND($iFlag, 2) Then $Counter += 1
    Else
    If BitAND($iFlag, 1) Then $Counter += 1
    EndIf
    Until 0
    EndIf
    WEnd
    Return $Counter
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von AspirinJunkie (11. März 2010 um 15:31)