fuck hatte davor ein *.txt eigebaut x| naja jetz funtzt es. danke!
Rekursive Datei/Ordner Auflistung per Objekt
-
-
hm ich komm mir grad bissle blöd vor...
ich ruf die funktion so auf:
[autoit]
[/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)aber als ergebnis landet das hier im log:
Code
Alles anzeigen94792.0456344028 K:\Musik\'s Cartoons\ K:\Musik\'s Dance Disco Megamix\ K:\Musik\'techno'\ K:\Musik\'techno'\Talla 2xlc\ K:\Musik\(04.) Rmx Crew Feat Ambush, I\ K:\Musik\(04.) Rmx Crew Feat Ambush, I\Unknown Album\ K:\Musik\(Acoustic) Rise Against\ K:\Musik\(Acoustic) Rise Against\Punk Goes Acoustic\ K:\Musik\(Aria)\ K:\Musik\(Aria)\(New Horizon)\ K:\Musik\(Blumchen)\ K:\Musik\(Blumchen)\Bicycle\ K:\Musik\(Everly Brothers) Bye Bye Love\ K:\Musik\(Fight Music Remix)\ K:\Musik\(Fight Music Remix)\Unknown Album\
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
was hab ich falsch verstanden? -
- Offizieller Beitrag
ZitatIhr ü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 mistpoker 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
-
- Offizieller Beitrag
Nimm meine Funktion, da kannst Du ein beliebiges RegExp-Pattern angeben.
-
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 ?
-
- Offizieller Beitrag
Das zeitintensive ist die rekursive Auflistung.
Wenn du diese Liste hast: Einfach durchwandern und was du noch brauchst abfragen (FileGetSize etc. pp). -
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]
[/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])
; 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_RekursivFunc _ShowSubFolders($Folder, $Ext = '*', $Dir = -1, $Delim = @CRLF)
[/autoit]
$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 ;==>_ShowSubFoldersIch 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")
[/autoit]
For $i = 1 To $array[0]
;Dein Aufruf mit $array[$i] als Parameter
NextWarum willst Du hierfür die Funktion ändern ?
-
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\kkWo 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
-
- Offizieller Beitrag
Bau dir am einfachsten direkt in die Funktion deine Ausschlußordner ein:
[autoit]Func _ShowSubFolders($Folder, $Ext='*', $Dir=-1, $Delim=@CRLF)
[/autoit]
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 -
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];==================================================================================================
[/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')
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_RekursivFunc _ShowSubFolders($Folder, $Ext = '*', $Dir = -1, $Delim = @CRLF)
[/autoit]
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]
For $Subfolder In $Folder.SubFolders
[/autoit]
; ================================= 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)klappt bei mir nicht, $Folder $SubFolder ist immer leer, aber das hier geht.
[autoit]For $Subfolder In $Folder.SubFolders
[/autoit]
;~ 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) -
- Offizieller Beitrag
warum benutzt Du dann nicht die GetExtensionName-Methode.
Boah, da fragst du mich was nach 3 1/2 Jahren... -
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.
-