Dateien suchen die X Tage alt sind

  • Hallo,
    ich entwickle gerade ein script mit dem ich einen Ordner auf Dateien untersuche die ein gewisses alter in x Tagen erreicht haben und dann die entsprechenden lösche.

    Nur bekomme ich jedes mal das Datum 1601/01/01 00:00:00

    [autoit]

    Func clean()
    $hSearch = FileFindFirstFile($cleandir&"*.*")

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

    While (True)
    $file = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    $filetime = _Date_Time_GetFileTime(@ScriptDir&"\"&$file)
    $afile = _Date_Time_FileTimeToArray($filetime[0])
    $sfile = StringFormat("%04d/%02d/%02d %02d:%02d:%02d", $afile[2], $afile[0], $afile[1], $afile[3], $afile[4], $afile[5])
    $diff = _DateDiff( 'D',$sfile,_NowCalc())
    If $file <> "" and $Diff >= $cleanday then
    FileDelete($cleandir&$tFile)
    Endif
    WEnd
    EndFunc

    [/autoit]

    Wer weiß mir zu helfen?

    MFG Chickmc

    Einmal editiert, zuletzt von Chickmc (12. November 2009 um 10:04)

  • Hi !

    Ich würde es mit FileGetTime ( "filename" [, option [, format]] ) machen, siehe Spoiler.

    Spoiler anzeigen
    [autoit]


    #include <Date.au3>
    MsgBox(0,"",_clean("c:\temp", 30))

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

    Func _clean($cleandir, $cleanday)
    $hSearch = FileFindFirstFile($cleandir & "\*.*")
    Local $list
    While (True)
    $file = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    $afile = FileGetTime($cleandir & "\" & $file)
    $sfile = StringFormat("%04d/%02d/%02d %02d:%02d:%02d", $afile[0], $afile[1], $afile[2], $afile[3], $afile[4], $afile[5])
    $diff = _DateDiff( 'D',$sfile,_NowCalc())
    If $Diff >= $cleanday then
    ;~ FileDelete($cleandir & "\" & $file)
    $list &= $file & " " & $sfile & " " & $diff & @CR
    Endif
    WEnd
    FileClose($hSearch)
    Return $list
    EndFunc

    [/autoit]


    ACHTUNG Bei dieser Funktion werden aber Verzeichnise auch mit einbezogen.
    Eventuell *.??? als such String verwenden.
    Endungen mit mehr als 3 Zeichen oder kleiner als 3 werden dann nicht berücksichtigt.


    Den Befehl _Date_Time_GetFileTime müsstes du so laut Hilfe benutzen.

    [autoit]


    ; Read file times
    $hFile = _WinAPI_CreateFile(@ScriptDir & "\Test.xyz", 2)
    if $hFile = 0 then _WinAPI_ShowError("Unable to open file")
    $aTime = _Date_Time_GetFileTime($hFile)
    _WinAPI_CloseHandle($hFile)

    [/autoit]

    If not :?: then ?( else :thumbup:

    5 Mal editiert, zuletzt von Concara (11. November 2009 um 17:44)

  • HI!

    Hier noch eine Version.
    Mit _FileListToArray($sPath[, $sFilter = "*"[, $iFlag = 0]]) .
    Bei diesem kannst du mit dem Flag angeben was du willst. 1 nur Files. 2 nur Ordner und wenn du es weg lässt alles Beide.

    LG
    Concara

    Spoiler anzeigen
    [autoit]


    #include <File.au3>
    #include <Date.au3>
    MsgBox(0,"",_clean("c:\temp\copy", 70))
    Func _clean($cleandir, $cleanday)
    Local $list, $hSearch, $afile, $sfile, $diff
    $hSearch = _FileListToArray($cleandir, "*", 1)
    If Not IsArray($hSearch) Then Return "Error: Keine Dateien vorhanden"
    If $hSearch[0] = "" Then Return "Error: Keine Dateien vorhanden"
    For $i = 1 To $hSearch[0]
    $afile = FileGetTime($cleandir & "\" & $hSearch[$i])
    $sfile = StringFormat("%04d/%02d/%02d %02d:%02d:%02d", $afile[0], $afile[1], $afile[2], $afile[3], $afile[4], $afile[5])
    $diff = _DateDiff( 'D',$sfile,_NowCalc())
    If $diff >= $cleanday then
    ;FileDelete($cleandir & "\" & $hSearch[$i])
    $list &= $hSearch[$i] & " " & $sfile & " " & $diff & @CR
    Endif
    Next
    If $list = "" Then $list = "Keine Dateien zum Löschen gefunden"
    Return $list
    EndFunc

    [/autoit]

    If not :?: then ?( else :thumbup:

  • Danke meine fertige Funktion schaut volgendermaßen aus.

    [autoit]

    Func clean()
    Local $afile, $tfile, $sfile

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

    $hSearch = FileFindFirstFile($cleandir & "*.*")
    While (True)
    $tfile = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    $afile = FileGetTime($cleandir & "\" & $tfile, 1, 0)
    $sfile = StringFormat("%04d/%02d/%02d %02d:%02d:%02d", $afile[0], $afile[1], $afile[2], $afile[3], $afile[4], $afile[5])
    $diff = _DateDiff( 'D',$sfile,_NowCalc())
    If $tfile <> "" and $Diff >= $cleanday then
    FileDelete($cleandir&"\"&$tFile)
    Endif
    WEnd
    FileClose($hSearch)
    EndFunc

    [/autoit]
  • Hast Du mal ein Beispielaufruf für die Funktion?
    Ich stecke gerade irgendwie fest ;)

    L I N A

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Spoiler anzeigen
    [autoit]


    #include <date.au3>

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

    global $Dir = "" ;Verzeichnis eintragen
    global $delday = 5 ; alle Dateien älter als 5 Tage werden ausgegeben (gelöscht)
    _clean($dir, $delday)

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

    Func _clean($cleandir, $cleanday)
    Local $afile, $tfile, $sfile

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

    $hSearch = FileFindFirstFile($cleandir & "*.*")
    While (True)
    $tfile = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    $afile = FileGetTime($cleandir & "\" & $tfile, 1, 0) ;Zeitstempel der Datei bestimmen
    $sfile = StringFormat("%04d/%02d/%02d %02d:%02d:%02d", $afile[0], $afile[1], $afile[2], $afile[3], $afile[4], $afile[5]) ;ins richtige Format für _Datediff bringen
    $diff = _DateDiff( 'D',$sfile,_NowCalc()) ;Vergleich Zeitstempel mit dem heutigem Datum
    If $tfile <> "" and $Diff >= $cleanday then ; wenn ... und $Diff >= als der "Cleanday" ist dann ...
    ;FileDelete($cleandir&"\"&$tFile) ; gleich löschen ist etwas hart als Beispiel
    ConsoleWrite($cleandir&"\"&$tFile & @crlf)
    Endif
    WEnd
    FileClose($hSearch)
    EndFunc

    [/autoit]


    So geht das.
    Man könnte auch als "Cleanday" ein richtiges Datum eingeben und mit _Datediff darauf prüfen.

  • Hallo nuts.

    Danke für den Beitrag.

    Hat sich nichts geändert, auch mit dem beispiel, löscht er bei mir keine Dateien unter f:\test\ auch wenn ich den Pfad angegeben habe.

    L I N A

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Hallo,
    ich habe meine variante jetzt so abgeändert, dass ich das Erstelldatum und das Geändertdatum abfrage und daurch eventuell das Geändertdatum als ältestes Datum erhalte. Dies geschieht meist wenn Dateien kopiert werden. Erstelldatum ist dann jünger als Änderungsdatum.

    Hier einmal wie ich die funktion aufrufe.

    [autoit]


    #include <Date.au3>

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

    $cleandir = IniRead ( @ScriptDir&"\config.ini", "Clean", "Pfad", "")
    $cleanday = IniRead ( @ScriptDir&"\config.ini", "Clean", "Alter", "")
    clean()

    [/autoit]

    und die Funktion

    Spoiler anzeigen
    [autoit]

    Func clean()
    Local $afile, $tfile, $sfile, $diff
    Local $afile2, $tfile2, $sfile2, $diff2

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

    $hSearch = FileFindFirstFile($cleandir & "*.*")
    While (True)
    $tfile = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    $afile = FileGetTime($cleandir & "\" & $tfile, 1, 0);Erstelldatum
    $sfile = StringFormat("%04d/%02d/%02d %02d:%02d:%02d", $afile[0], $afile[1], $afile[2], $afile[3], $afile[4], $afile[5])
    $diff = _DateDiff( 'D',$sfile,_NowCalc())
    $afile2 = FileGetTime($cleandir & "\" & $tfile, 0, 0);Änderungsdatum
    $sfile2 = StringFormat("%04d/%02d/%02d %02d:%02d:%02d", $afile2[0], $afile2[1], $afile2[2], $afile2[3], $afile2[4], $afile2[5])
    $diff2 = _DateDiff( 'D',$sfile2,_NowCalc())
    If $tfile <> "" Then ;Hier überprüfe ich ob ich überhaupt eine Datei habe
    if $diff >= $cleanday or $diff2 >= $cleanday then FileDelete($cleandir&"\"&$tfile)
    EndIf
    WEnd
    FileClose($hSearch)
    EndFunc

    [/autoit]


    Also total simpel.
    Und das FileClose nicht vergessen, sonst kann es sein dass man selber nichts löschen kann oder so.

    Einmal editiert, zuletzt von Chickmc (13. November 2009 um 09:09)