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
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
Ich denke da an die Rekursive Suche
Hast du auch ein beispiel?
Das habe ich auch gefunden ...
habe bloss den parameter für mein vorhaben nicht gefunden ??
ZitatRückgabewert ist ein Array mit der Anzahl gefundener Pfade in Array[0].
Du musst doch nur die Daten in ein Array lesen, und hast dann in Array[0] die Anzahl
#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
;==================================================================================================
; 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
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
edit: omg, das war extrem langsam
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
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:
Global $Path = @SystemDir
[/autoit] [autoit][/autoit] [autoit]$Files = CountAllFiles($Path, 1)
$Folders = CountAllFiles($Path, 2)
MsgBox(0,"Anzahl", "Dateien: " & $Files & @CRLF & "Ordner: " & $Folders)
; 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
If StringRight($sStDir, 1) = '\' Then $sStDir = StringTrimRight($sStDir, 1)
If Not FileExists($sStDir) Then Return SetError(2, 0, "")
$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