Eigenmächtiger Erweiterungsversuch von Bugfix`s _GetFilesFolder_Rekursiv($sPath

  • Hallo ich habe ein "kleines Problem" beim Erweitern / umbauen der UDF von Bugfix.
    Ich wollte halt eine Progressbar hinzufügen und den Output in eine Datei umleiten.

    Das funktionierte auch schon allerdings war dort die Anzahl fix und die Ausgabedatei absolut in der Funktion benannt.

    Nun wollte ich die Werte und ob Progress überhaupt da sein soll beim Funktionsaufruf mit übergeben.
    In der Messagebox stehen anfangs noch die richtigen Werte drin, überschreibt die dann aber mit den defaults aus dem Subfoldersfunktionaufruf, beim 2.Mal.

    Irgendwie habe ich da ein Brett vorm Kopf und bevor ich die Sache noch weiter verkompliziere frage ich doch mal ;)
    Besten Dank an Bugfix für die UDF, nutze ich schon recht lange.
    Besten Dank auch an AspirinJunkie für _CountAllFiles, ist wirklich fix.

    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])
    ;
    ; geändert durch Dietmar // Progress integriert und Ausgabe in INI-Datei mit Dateieigenschaften
    ;
    ;==================================================================================================

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

    Dim $Progress_count =0
    ;~Dim $Progress_enable
    ;~Dim $Progress_limit

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

    Func _GetFilesFolder_Rekursiv($sPath, $sExt='*', $iDir=-1, $iRetType=0, $sDelim='0', $sProgress_enable=1, $sProgress_limit=0, $sExport_file="c:\dummy.ini")
    ;~ MsgBox(4096,"",$sPath & @CR & $sExt & @CRLF & $iDir & @CRLF & $iRetType & @CRLF & $sDelim & @CRLF & $sProgress_enable & @CRLF & $sProgress_limit & @CRLF & $sExport_file)
    ;~ Exit
    $sPath_Len = StringLen($sPath)

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

    If $sProgress_limit = 0 Then
    $sProgress_enable = 0
    Else
    If $sProgress_enable = 1 Then
    $sProgress_count = 0
    ProgressOn("Dateiliste von '" & $sPath & "' wird erstellt", "Bitte haben Sie etwas Geduld.")
    EndIf
    EndIf

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

    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,$sProgress_enable,$sProgress_limit,$sExport_file,$sPath_Len)
    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
    If $sProgress_enable = 1 Then ProgressOff()
    EndFunc

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

    Func _ShowSubFolders($Folder, $Ext='*', $Dir=-1, $Delim=@CRLF, $Progress_enable=1, $Progress_limit=2000, $Export_file="d:\dummy.ini",$Path_Len=1)

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

    ;~ MsgBox(4096,"",@CRLF & $Ext & @CRLF & $Dir & @CRLF & $Delim & @CRLF & $Progress_enable & @CRLF & $Progress_limit & @CRLF & $Export_file & @CRLF & $sPath_Len)
    ;~ Exit
    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
    IniWrite($Export_file,StringTrimRight(StringTrimLeft($file.path,$Path_Len),StringLen($file.name)),$file.Name,'"' & $file.Size & "|" & $file.DateCreated & "|" & $file.DateLastModified & "|" & FileGetVersion($file.Path,"FileVersion") & "|" & FileGetVersion($file.Path,"ProductVersion") & '"')
    If $Progress_enable = 1 Then
    $Progress_count = $Progress_count + 1
    ProgressSet($Progress_count/($Progress_limit/100), $Progress_count & " von " & $Progress_limit & " Dateien ermittelt")
    EndIf
    $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

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

    EndFunc

    [/autoit]

    Aufgerufen wird das ganze aus der Hauptgui wie folgt

    [autoit]

    _GetFilesFolder_Rekursiv($searchdir, '*', 0, 0, 0, 1, _CountAllFiles($searchdir,1), $tmp_file)

    [/autoit]

    Und dies hier wird genommen anstatt die zur übergebenen Funktion

    [autoit]

    $Progress_enable=1, $Progress_limit=2000, $Export_file="d:\dummy.ini",$Path_Len=1

    [/autoit]

    Wäre über Tipps erfreut :D

    Achtung Anfänger! :whistling:

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

    3 Mal editiert, zuletzt von Dietmar (12. September 2010 um 23:28)

  • Hier ist sie, wird aber nicht wirklich benötigt da man dort auch z.B. etwas <> 2000 eintragen kann um einen Effekt zu sehen.

    Spoiler anzeigen
    [autoit]

    Func _CountAllFiles($sStDir, $iFlag = 3) ; by AspirinJunkie - benötigt .Net für Stack - $Flag auf 1 für Dateien, 2 für Ordner, 3 für beide
    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]

    Achtung Anfänger! :whistling:

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

  • Hallo Dietmar,

    so sollte es funktionieren:

    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])
    ;
    ; geändert durch Dietmar // Progress integriert und Ausgabe in INI-Datei mit Dateieigenschaften
    ;
    ;==================================================================================================

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

    Dim $Progress_count = 0
    ;~Dim $Progress_enable
    ;~Dim $Progress_limit

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

    Func _GetFilesFolder_Rekursiv($sPath, $sExt = '*', $iDir = -1, $iRetType = 0, $sDelim = '0', $sProgress_enable = 1, $sProgress_limit = 0, $sExport_file = "c:\dummy.ini")
    ;~ MsgBox(4096,"",$sPath & @CR & $sExt & @CRLF & $iDir & @CRLF & $iRetType & @CRLF & $sDelim & @CRLF & $sProgress_enable & @CRLF & $sProgress_limit & @CRLF & $sExport_file)
    ;~ Exit
    $sPath_Len = StringLen($sPath)

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

    If $sProgress_limit = 0 Then
    $sProgress_enable = 0
    Else
    If $sProgress_enable = 1 Then
    $sProgress_count = 0
    ProgressOn("Dateiliste von '" & $sPath & "' wird erstellt", "Bitte haben Sie etwas Geduld.")
    EndIf
    EndIf

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

    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
    FileDelete($sExport_file) ;<=======================
    _ShowSubFolders($oFSO.GetFolder($sPath), $sExt, $iDir, $sDelim, $sProgress_enable, $sProgress_limit, $sExport_file, $sPath_Len)
    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
    If $sProgress_enable = 1 Then ProgressOff()
    EndFunc ;==>_GetFilesFolder_Rekursiv

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

    Func _ShowSubFolders($Folder, $Ext = '*', $Dir = -1, $Delim = @CRLF, $Progress_enable = 1, $Progress_limit = 2000, $Export_file = "d:\dummy.ini", $Path_Len = 1)

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

    ;~ MsgBox(4096,"",@CRLF & $Ext & @CRLF & $Dir & @CRLF & $Delim & @CRLF & $Progress_enable & @CRLF & $Progress_limit & @CRLF & $Export_file & @CRLF & $sPath_Len)
    ;~ Exit
    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
    IniWrite($Export_file, StringTrimRight(StringTrimLeft($file.path, $Path_Len), StringLen($file.name)), $file.Name, '"' & $file.Size & "|" & $file.DateCreated & "|" & $file.DateLastModified & "|" & FileGetVersion($file.Path, "FileVersion") & "|" & FileGetVersion($file.Path, "ProductVersion") & '"')
    If $Progress_enable = 1 Then
    $Progress_count = $Progress_count + 1
    ProgressSet($Progress_count / ($Progress_limit / 100), $Progress_count & " von " & $Progress_limit & " Dateien ermittelt")
    EndIf
    $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, $Progress_enable, $Progress_limit, $Export_file) ;<==========================
    Next
    EndFunc ;==>_ShowSubFolders
    ;Func _GetFilesFolder_Rekursiv($sPath, $sExt = '*', $iDir = -1, $iRetType = 0, $sDelim = '0', $sProgress_enable = 1, $sProgress_limit = 0, $sExport_file = "c:\dummy.ini")

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

    _GetFilesFolder_Rekursiv("c:\programme\autoIt3\downloads", '*', 0, 0, 0, 1,10000, "c:\test.txt")

    [/autoit]


    ich habe lediglich Filedelete (damit die Ausgabedatei gelöscgt wird) und beim rekursiven Aufruf von _ShowSubFolders alle Parameter angegeben,

    getestet habe ich so:

    [autoit]

    _GetFilesFolder_Rekursiv("c:\programme\autoIt3\downloads", '*', 0, 0, 0, 1,10000, @ScriptDir & "\test.txt")

    [/autoit]

    mfg autoBert

    mfg autoBert

  • ich Blindfisch den unteren Aufruf komplett übersehen soweit musste ich nie runterscrollen ;)
    Die Datei wird bei mir beim Start der Hauptgui gelöscht, habe noch etwas ergänzt und dann klappt auch das Abschneiden des Suchpfades.

    [autoit]

    _ShowSubFolders($Subfolder, $Ext, $Dir, $Delim, $Progress_enable, $Progress_limit, $Export_file,$Path_Len)

    [/autoit]

    Besten Dank

    Achtung Anfänger! :whistling:

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