Jüngste Datei finden unterordner einbeziehen.

  • Hallo, ich möchte in einem Verzeichnis alle Dateien inclusive der in unter Ordnern nach der jüngsten Datei suchen und diese ausgeben.

    Ich habe schon etwas gesucht hier im Forum und mit Dateien und Ordnern innerhalb des angegebenen Ordners Klappt das schon ganz gut, nur fehlen mir die Dateien in den Ordnern in diesem Verzeichnis.

    Hat da jemand eine Idee für mich?


    [autoit]


    FileChangeDir("e:\new")
    $search=FileFindFirstFile("*")
    While 1
    $lastfile=FileFindNextFile($search)
    If $lastfile="" Then ExitLoop
    If FileGetAttrib($lastfile) Then ; Nur Dateien checken, keine Verzeichnisse
    If IsDeclared("joungest") Then
    If FileGetTime($lastfile,Default,1)<$joungest Then $joungest=$lastfile
    Else
    $joungest=$lastfile
    EndIf
    EndIf
    WEnd
    $date = FileGetTime($joungest,0,0) ;gibt das Änderungsdatum in einem String zurück
    MsgBox(0,$joungest,$date[0]&$date[1]&$date[2])
    FileClose($search)

    [/autoit]


    Danke euch schon mal

    BEN

  • Ich habe schonmal etwas weiter gemacht, das Ganze soll ein "Backup checker" werden.

    Es werden individuell Backups ausgeführt wann man gerade zeit hat. Es gibt Kein LOG oder sonstiges, die Files wandern auf ein Plattensystem.

    Am ende der woche muss ich die Dort liegenden ordner durch suchen und die neuste Datei finden um ein Report zu schreiben. Bzw. die user auf ein fehlendes Backup an zu sprechen.

    ich habe mir jetzt eine GUI gebastelt in der mir das angezeigt wird, aber mein Problem ist, dass bisher nur die Dateien und Ordner in dem "stammpfad" geprüft werden, nicht aber die in den Unterordnern.

    [autoit]


    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=E:\autoit\bak_status.kxf
    $Form1 = GUICreate("Backup Status...", 267, 330, 193, 150)
    $G_DD = GUICtrlCreateGroup("DD", 8, 8, 121, 57)
    $L_DD = GUICtrlCreateLabel("", 16, 24, 107, 33)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $G_JS = GUICtrlCreateGroup("JS", 8, 72, 121, 57)
    $L_JS = GUICtrlCreateLabel("", 16, 88, 107, 33)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $G_LH = GUICtrlCreateGroup("LH", 8, 136, 121, 57)
    $L_LH= GUICtrlCreateLabel("", 16, 152, 107, 33)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $G_MS = GUICtrlCreateGroup("MS", 8, 200, 121, 57)
    $L_MS = GUICtrlCreateLabel("", 16, 216, 107, 33)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $G_OG = GUICtrlCreateGroup("OG", 8, 264, 121, 57)
    $L_OG = GUICtrlCreateLabel("", 16, 280, 107, 33)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $G_RK = GUICtrlCreateGroup("RK", 136, 8, 121, 57)
    $L_RK = GUICtrlCreateLabel("", 144, 24, 107, 33)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $G_RK1 = GUICtrlCreateGroup("RK1", 136, 72, 121, 57)
    $L_RK1 = GUICtrlCreateLabel("", 144, 88, 107, 33)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $G_SS = GUICtrlCreateGroup("SS", 136, 136, 121, 57)
    $L_SS = GUICtrlCreateLabel("", 144, 152, 107, 33)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $G_VB = GUICtrlCreateGroup("VB", 136, 200, 121, 57)
    $L_VB = GUICtrlCreateLabel("", 144, 216, 107, 33)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $B_check = GUICtrlCreateButton("check it",200,270)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    Global $date=""

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg

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

    Case $B_check

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

    ;hier wird DD angefragt
    FileChangeDir("e:\DD")
    _joungest()
    $L_DD = GUICtrlCreateLabel($date[0]&"."&$date[1]&"."&$date[2], 16, 24, 107, 33)

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

    ;hier wird JS abgefragt
    FileChangeDir("e:\new")
    _joungest()
    $L_JS = GUICtrlCreateLabel($date[0]&"."&$date[1]&"."&$date[2], 16, 88, 107, 33)

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

    Case $GUI_EVENT_CLOSE
    Exit

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

    EndSwitch
    WEnd

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

    Func _joungest()
    $search=FileFindFirstFile("*")
    While 1
    $lastfile=FileFindNextFile($search)
    If $lastfile="" Then ExitLoop
    If FileGetAttrib($lastfile) Then ; Nur Dateien checken, keine Verzeichnisse
    If IsDeclared("joungest") Then
    If FileGetTime($lastfile,Default,1)<$joungest Then $joungest=$lastfile
    Else
    $joungest=$lastfile
    EndIf
    EndIf
    WEnd
    $date = FileGetTime($joungest,0,0) ;gibt das Änderungsdatum in einem String zurück
    ;MsgBox(0,$joungest,$date[0]&$date[1]&$date[2])
    FileClose($search)
    EndFunc

    [/autoit]


    hat jemand eine Idee für mich, ich mache mich leider nicht besonders gut als Programmierer.

    Danke schön schon mal!

  • Hallo

    Ich hatte mir mal die Funktion Filefind vorgenommen und geändert. Allerdings müßtest Du noch die Funktion auf Herz und Nieren Überprüfen und die SetError Funktion noch richtig einarbeiten.

    [autoit]

    Func _Dateiliste( $sPath, $sFilter)

    Local $arrFilter, $arrPfad[2], $i, $x, $z, $hSearch, $sFile, $asFileList[1][2]

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

    ;Überprüfung der Parameter
    If Not FileExists($sPath) Then MsgBox( 0, "Fehler", "Ordner " & $spath & " existiert nicht! ");ob das Verzeichnis existiert
    If (StringInStr($sFilter, "\")) Or (StringInStr($sFilter, "/")) Or (StringInStr($sFilter, ":")) Or (StringInStr($sFilter, ">")) Or (StringInStr($sFilter, "<")) Or _
    (StringInStr($sFilter, "|")) Or (StringStripWS($sFilter, 8) = "") Then MsgBox( 0, "Fehler", "Fehler bei der Übergabe der Suchkriterien durch ein ungültiges Zeichen!") ;des Suchfilters auf ungültige Parameter
    If (StringMid($sPath, StringLen($sPath), 1) = "\") Then $sPath = StringTrimRight($sPath, 1) ;Wenn letztes Zeichen ein / ist wird es gelöscht benötigt für Win98 für x:\ root dir

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

    $arrFilter = StringSplit($sFilter, ';', 2)
    $arrPfad[0] = 1
    $arrPfad[1] = @ScriptDir & $sPath
    $z = 1 ;Zählvariabel für Ordnerarray
    $i = 1 ;Zählvariabel für Dateiarray

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

    Do
    ;Ordnersuche
    $hSearch = FileFindFirstFile($arrPfad[$x] & "\*")
    If $hSearch = -1 Then ;Return $asFileList;SetError(4, 4, "")
    Else
    Do
    $sFile = FileFindNextFile($hSearch)
    If $sFile = "" Then
    Else
    If StringInStr(FileGetAttrib($arrPfad[$x] & "\" & $sFile), "D") <> 0 Then
    $z += 1
    $arrPfad[0] = $z
    if UBound ($arrPfad) = $arrPfad[0] Then ReDim $arrPfad[UBound($arrPfad) * 2]
    $arrPfad[$z] = $arrPfad[$x] & "\" & $sFile
    EndIf
    EndIf
    Until $sFile = ""
    EndIf
    FileClose($hSearch)

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

    ;Dateisuche
    For $element In $arrFilter
    $hSearch = FileFindFirstFile($arrPfad[$x] & "\" & $element)
    If $hSearch = -1 Then
    Else
    Do
    $sFile = FileFindNextFile($hSearch)
    If $sFile = "" Then
    Else
    $asFileList[0][0] += 1
    If UBound($asFileList) <= $asFileList[0][0] Then ReDim $asFileList[UBound($asFileList) + 10][2]
    $asFileList[$i][0] = $sFile
    $asFileList[$i][1] = $arrPfad[$x]
    $i += 1
    EndIf
    Until $sFile = ""
    EndIf
    Next
    FileClose($hSearch)
    $x += 1
    Until $x = UBound($arrPfad) Or $arrPfad[$x] = ""
    ReDim $arrPfad[$arrPfad[0] +1]
    ReDim $asFileList[$asFileList[0][0] + 1] [2]
    ;~ _ArraySort($asFileList, 0)
    Return $asFileList
    EndFunc

    [/autoit]

    Vielleicht kannst Du damit was anfangen.

    Gruß Ralf

  • Danke euch erstmal, ich habe es jetzt mal mit der funktion von bugfix versucht. (sah leichter aus) ;)

    Jetzt habe ich aber das Problem, das er nicht mehr nach der jüngstendatei abfragt. Hier mal das Script ohne GUI, ich seh nur leider den Fehler nicht?

    ?(

    [autoit]


    #include <array.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <_GetFilesFolder_Rekursiv.au3>
    Global $counter ;zähler der das ende des Array bestimmen soll
    Global $filenr ;nummer des Feldes im Array was verwendet wird
    Global $joungest ;name des Jüngsten Files
    Global $date
    Global $Folder
    Global $joungest
    Global $path ="e:\dd\"

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

    _check()

    ; Hier Liegen die Funktionen
    Func _check()
    Global $V_Check = _GetFilesFolder_Rekursiv($path) ;Liest inhalt des angegebenen Ordner, by Bugfix
    _ArrayDisplay($V_Check,"v_check") ;nur zum debuggen
    Do

    $filenr = $filenr +1
    $file = $V_Check[$filenr]

    If $file="" Then ExitLoop
    If FileGetAttrib($file) <> "D" Then ; Nur Dateien checken, keine Verzeichnisse
    If IsDeclared("joungest") Then
    If FileGetTime($file,Default,1)<$joungest Then $joungest=$file
    Else
    $joungest=$file
    EndIf
    EndIf
    $date = FileGetTime($joungest,0,0) ;gibt das Änderungsdatum in einem String zurück
    MsgBox(0,$joungest,$date)
    $counter = $counter +1
    Until $counter = $V_Check[0]
    MsgBox(0,"joungest ist:",$joungest)
    EndFunc

    [/autoit]


    Habt ihr noche einen Tipp?


    Danke schön

    Ben

    • Offizieller Beitrag

    Du kannst ein Array natürlich auch mit Do-Until durchlaufen, aber einfacher ist For-Next.
    So sollte es funktionieren:

    Spoiler anzeigen
    [autoit]

    #include <array.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include '_GetFilesFolder_Rekursiv.au3'
    ;~ Global $counter ;zähler der das ende des Array bestimmen soll <== nicht nötig
    ;~ Global $filenr ;nummer des Feldes im Array was verwendet wird <== nicht nötig
    Global $joungest ;name des Jüngsten Files
    ;~ Global $date <== nicht nötig
    Global $Folder
    Global $joungest = ''
    Global $path = "e:\dd\"
    Global $V_Check ; <== falls das Array außerhalb der Func genutzt werden soll, auch außerhalb deklarieren

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

    _check()

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

    ; Hier Liegen die Funktionen
    Func _check()
    Local $file, $getTimeOld, $getTimeNew
    $V_Check = _GetFilesFolder_Rekursiv($path, '*', 0) ; < Parameter für NUR Files übergeben, Liest inhalt des angegebenen Ordner, by Bugfix
    For $i = 1 To UBound($V_Check) -1
    $file = $V_Check[$i]
    $getTimeNew = FileGetTime($file, Default, 1)
    If $joungest = '' Then
    $joungest = $file
    $getTimeOld = $getTimeNew
    Else
    If $getTimeNew > $getTimeOld Then
    $joungest = $file
    $getTimeOld = $getTimeNew
    ConsoleWrite('jüngste (Moment): ' & $joungest & @TAB & $getTimeOld & @CRLF)
    EndIf
    EndIf
    Next
    ConsoleWrite(@CRLF & 'jüngste (Gesamt): ' & $joungest & @TAB & $getTimeOld & @CRLF)
    EndFunc

    [/autoit]
  • Hey, super! ich danke Dir!

    ich hab es noch abgepasst,das ich nur das Datum im Format YYYY.MM.DD erhalte.

    Funktioniert wunderbar. mal sehn ob ich das heute noch live testen kann.

    jetzt muss ich nur noch verstehen was du da schönes gezaubert hast, aber langsam blicke ich immer mehr durch. :thumbup:

    Spoiler anzeigen
    [autoit]

    #include <array.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <_GetFilesFolder_Rekursiv.au3>

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

    #Region ### START Koda GUI section ### Form=E:\autoit\bak_status.kxf
    $Form1 = GUICreate("Backup Status...", 267, 330, 193, 150)
    $G_DD = GUICtrlCreateGroup("DD", 8, 8, 121, 57)
    $L_DD = GUICtrlCreateLabel("", 16, 24, 107, 33)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $G_JS = GUICtrlCreateGroup("JS", 8, 72, 121, 57)
    $L_JS = GUICtrlCreateLabel("", 16, 88, 107, 33)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $G_LH = GUICtrlCreateGroup("LH", 8, 136, 121, 57)
    $L_LH= GUICtrlCreateLabel("", 16, 152, 107, 33)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $G_MS = GUICtrlCreateGroup("MS", 8, 200, 121, 57)
    $L_MS = GUICtrlCreateLabel("", 16, 216, 107, 33)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $G_OG = GUICtrlCreateGroup("OG", 8, 264, 121, 57)
    $L_OG = GUICtrlCreateLabel("", 16, 280, 107, 33)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $G_RK = GUICtrlCreateGroup("RK", 136, 8, 121, 57)
    $L_RK = GUICtrlCreateLabel("", 144, 24, 107, 33)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $G_RKB = GUICtrlCreateGroup("RKB", 136, 72, 121, 57)
    $L_RKB = GUICtrlCreateLabel("", 144, 88, 107, 33)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $G_SS = GUICtrlCreateGroup("SS", 136, 136, 121, 57)
    $L_SS = GUICtrlCreateLabel("", 144, 152, 107, 33)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $G_VB = GUICtrlCreateGroup("VB", 136, 200, 121, 57)
    $L_VB = GUICtrlCreateLabel("", 144, 216, 107, 33)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $B_check = GUICtrlCreateButton("check it",200,270)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    Global $joungest ;name des Jüngsten Files
    Global $Folder
    Global $joungest = ''
    Global $V_Check
    Global $getTimeOld
    Global $backuptime

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg

    Case $B_check

    ;hier wird DD angefragt
    $path="e:\DD"
    _check()
    $L_DD = GUICtrlCreateLabel($backuptime, 16, 24, 107, 33)

    ;hier wird JS abgefragt
    $path="e:\new"
    _check()
    $L_JS = GUICtrlCreateLabel($backuptime & @CRLF, 16, 88, 107, 33)

    ;hier wird LH abgefragt
    $path="e:\DD"
    _check()
    $L_LH = $L_LH= GUICtrlCreateLabel($backuptime, 16, 152, 107, 33)

    ;hier wird MS abgefragt
    $path="e:\DD"
    _check()
    $L_MS = GUICtrlCreateLabel($backuptime, 16, 216, 107, 33)

    ;hier wird OG abgefragt
    $path="e:\DD"
    _check()
    $L_OG = GUICtrlCreateLabel($backuptime, 16, 280, 107, 33)

    ;hier wird Rk abgefragt
    $path="e:\DD"
    _check()
    $L_RK = GUICtrlCreateLabel($backuptime, 144, 24, 107, 33)

    ;hier wird RKB abgefragt
    $path="e:\DD"
    _check()
    $L_RKB = GUICtrlCreateLabel($backuptime, 144, 88, 107, 33)

    ;hier wird SS abgefragt
    $path="e:\DD"
    _check()
    $L_SS = GUICtrlCreateLabel($backuptime, 144, 152, 107, 33)

    ;hier wird VB abgefragt
    $path="e:\DD"
    _check()
    $L_VB = GUICtrlCreateLabel($backuptime, 144, 216, 107, 33)


    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

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

    Func _check()
    Local $file, $getTimeOld, $getTimeNew
    $V_Check = _GetFilesFolder_Rekursiv($path, '*', 0) ; < Parameter für NUR Files übergeben, Liest inhalt des angegebenen Ordner, by Bugfix
    For $i = 1 To UBound($V_Check) -1
    $file = $V_Check[$i]
    $getTimeNew = FileGetTime($file, Default, 1)
    If $joungest = '' Then
    $joungest = $file
    $getTimeOld = $getTimeNew
    Else
    If $getTimeNew > $getTimeOld Then
    $joungest = $file
    $getTimeOld = $getTimeNew
    EndIf
    EndIf
    Next
    $time= FileGetTime($joungest,0,0)
    $backuptime = $time[0]&"."&$time[1]&"."&$time[2]
    EndFunc

    [/autoit]
  • zu früh gefreut, bei Leerem "root" zeigt er mir das selbe datum wie bei dem Verzeichniss was er vorher gefunden hatte.? ?(