_FileListToArray nach Datum sortieren

  • Hallo zusammen,

    kurze und knappe Frage, kann ich die Dateien eines Ordners mit _FileListToArray() auch in der Reihenfolge des Datei-Datums einlesen?

    Das Array später zu sortieren geht ja nicht, weil ich dann ja die Datumsangaben dazu nicht habe.

    Schönen Dank schon mal für Eure Hilfe.
    (Das kann ich jetzt schon sagen, weil ja bisher immer gute und vernünftige Antworten gekommen sind :thumbup: )

    Michael

    Einmal editiert, zuletzt von Michael B. (13. April 2011 um 15:17)

  • Bisschen umständlich - sollte aber erstmal funktionieren:

    Spoiler anzeigen
    [autoit]

    #include "Array.au3"

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

    $aFile = _FileListDateSorted(@SystemDir, "*", 3, 0)
    If @error Then
    MsgBox(0, "Fehlernummer", @error)
    Else
    _ArrayDisplay($aFile)
    EndIf

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

    ; $iTimeType: 0 = Verändert, 1 = Erstellt, 2 = Letzter Zugriff
    Func _FileListDateSorted($sPath, Const $sFilter = "*", Const $iFlag = 3, Const $iTimeType = 0)
    $sPath = StringRegExpReplace($sPath, "[\\/]+\z", "") & "\" ; ensure single trailing backslash
    If Not FileExists($sPath) Then Return SetError(1, 1, "")
    If StringRegExp($sFilter, "[\\/:><\|]|(?s)\A\s*\z") Then Return SetError(2, 2, "")
    If Not ($iFlag = 3 Or $iFlag = 1 Or $iFlag = 2) Then Return SetError(3, 3, "")

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

    Local $aSize = DirGetSize($sPath, 1 + 2)
    Local $iSize = (BitAND($iFlag, 1) > 0) * $aSize[1] + (BitAND($iFlag, 2) > 0) * $aSize[2]
    Local $aFilesTemp[$iSize][2]

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

    $hSearch = FileFindFirstFile($sPath & $sFilter)
    If @error Then Return SetError(4, 4, "")

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

    Local $i = 0
    Do
    $sFile = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    If BitXOR(@extended + 1, $iFlag) And $iFlag <> 3 Then ContinueLoop

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

    $aFilesTemp[$i][0] = $sFile
    $aFilesTemp[$i][1] = FileGetJulian($sPath & $sFile, $iTimeType)
    $i += 1
    Until 0
    FileClose($hSearch)

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

    _ArraySort($aFilesTemp, 0, 0, 0, 1)

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

    Local $aRet[$iSize + 1] = [$iSize]
    For $i = 1 To $iSize
    $aRet[$i] = $aFilesTemp[$i - 1][0]
    Next
    Return $aRet
    EndFunc ;==>_FileListDateSorted

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

    Func FileGetJulian(Const $sPath, Const $iFlag = 0)
    Local Const $aTime = FileGetTime($sPath, $iFlag, 0)
    Return Date_Gregorian2JD($aTime[0], $aTime[1], $aTime[2], $aTime[3], $aTime[4], $aTime[5])
    EndFunc ;==>FileGetJulian

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

    Func Date_Gregorian2JD(Const $DD, Const $MM, Const $JJ, Const $iH = 0, Const $iM = 0, Const $iS = 0)
    Local $y4800 = $JJ + 4800
    Local $a = division($y4800, 100)
    Local $b = Mod($y4800, 100)
    Local $iRet = 146097 * division($a, 4) + 36524 * Mod($a, 4) + 1461 * division($b, 4) + 365 * Mod($b, 4) + division((7 * ($MM - 2)), 12) + 30 * $MM + 1 * $DD + 1721029 - 1753164
    Return $iRet + ($iH * ($iH - 12)) / 24 + $iM / 1440 + $iS / 86400
    EndFunc ;==>Date_Gregorian2JD

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

    Func division(Const $zaehler, Const $nenner)
    Local $quotient = $zaehler / $nenner
    Local $rest = Mod($zaehler, $nenner)
    Return Round($quotient - ($rest / $nenner))
    EndFunc ;==>division

    [/autoit]
  • Geht auch einfacher/kürzer:

    [autoit]


    #Include <File.au3>
    #Include <Array.au3>

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

    ; 1. File Array einlesen
    $filelist = _filelisttoArray(@ScriptDir,"*",1) ; normale alphabetisch sortierte Liste
    _ArrayDisplay($filelist)

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

    ; 2. 2D Array erstellen
    local $filelistExt[$filelist[0]][2] ; 2D Array
    for $i=1 to $filelist[0]
    $filelistExt[$i-1][0] = $filelist[$i]
    $filelistExt[$i-1][1] = FileGetTime ( $filelist[$i] , 0 , 1 ) ; ggf. den 2. Parameter ändern wenn ein anderes Datum erwünscht ist
    next
    _ArrayDisplay($filelistExt)

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

    ; 3. 2D Array nach Datum sortieren:
    _ArraySort($filelistExt, 0, 0, 0, 1) ; Sortiert aufsteigend nach Datum
    _ArrayDisplay($filelistExt)

    [/autoit]