zuletzt erstellte Datei herausfinden ink Dateiname

  • Hallo zusammen,
    benötige einen Ansatz :
    ein Screenshotprogramm legt PNGs in einem Verzeichnis ab mit unterschiedlichen Namen.
    Per Script soll der zuletzt erstellte Screenshot weiter verarbeitet werden.
    Mir fehlt da leider komplett der Ansatz zur Lösung. Hier muss dann gesucht und nach "geändet am" sortiert werden ..

    vielen dank

    Einmal editiert, zuletzt von Flieger (27. Oktober 2010 um 14:17) aus folgendem Grund: immer wieder superschnelle Antworten, Respekt.

  • Die namen setzen sich doch bestimmt aus gewissen sachen zusammen?
    Vllt Datum?
    Oder einfach ne fortlaufende Nummer?
    Man könnte dann einfach alle Dateien einlesen und raussuchen.
    Das einlesen is hier im Forum schon öfter besprochen worden, Ich werds mal raussuchen und verlinken

    EDIT:
    Hier könntest du den / die Ordner durchsuchen lassen

    Ich benutze eine leicht abgewandelte Form von FLwStr von AspirinJunkie

    Einmal editiert, zuletzt von Kijan (27. Oktober 2010 um 10:41)

  • Geht zum Beispiel so ;)
    Bei Bedarf kann _filelisttoarray auch noch einen Filter *.jpg oder wie auch immer deine Dateien benannt sind erhalten.

    [autoit]


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

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

    $folder = "C:\windows\temp"
    $array = _FileListToArray($folder,"*",1)
    ;_ArrayDisplay($array)
    $newestfiledate = 0
    $newestfilename = ""

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

    $counter = 1
    While $counter <= $array[0]
    $curDate = FileGetTime ( $folder & "\" & $array[$counter], 0 , 1 )
    if $curDate > $newestfiledate Then
    $newestfiledate = $curDate
    $newestfilename = $array[$counter]
    EndIf
    $counter = $counter + 1
    WEnd

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

    MsgBox(1,"Ergebnis","Die neueste Datei heisst:" & @LF & $folder & "\" & $newestfilename)

    [/autoit]

    2 Mal editiert, zuletzt von misterspeed (27. Oktober 2010 um 13:38) aus folgendem Grund: Sorry hatte auch Verzeichnisse im array...

  • ohoh

    meine andere Idee: das Bild ist ja schon in der Zwischenablage durch das Screenshotprog.
    Wie kann denn ein Script eine Datei daraus erstellen ?
    _ClipBoard_GetData kapier ich leider nicht ?(

    EDIT:
    misterspeed : das geht erst mal , braucht halt seine Zeit bei vielen Dateien im Verzeichnis.

    danke !

    Einmal editiert, zuletzt von Flieger (27. Oktober 2010 um 13:47)

  • Halt ich für eine schlechte Idee, denn wie kannst du sicher sein, dass sich das Bild wirklich in der Zwischenablage befindet und nicht zufällig der Benutzer oder ein anderes Programm etwas anderes in die Zwischenablage kopiert. Ob es so eine Funktion gibt weiss ich nicht, aber evtl. lohnt ja stattdessen auch ein Blick auf die Funktionen unter ScreenCapture Managment bei den UDFs (siehe Hilfedatei).

    EDIT:

    Die Screenshots müssten doch fortlaufende Nummern haben, wenn ja kannst du doch auch einfach nur filelisttoarray benutzen und die letzte Datei mit $array[$array[0]] ausgeben, da diese Liste alphabetisch sortiert ist. Das Dauert bei sehr vielen Dateien zwar auch etwas, aber wenigstens sparst du dir die Abfrage der Datei Änderungsdaten.

    Einmal editiert, zuletzt von misterspeed (27. Oktober 2010 um 14:14)

    • Offizieller Beitrag

    Versuch zur Auflistung mal die DOS-Variante. Sollte eindeutig schneller sein.

    Spoiler anzeigen
    [autoit]

    #include <Constants.au3>
    Local $sFullPath = 'C:\test'
    Local $sCMD = 'DIR ' & $sFullPath & '/A-D-S /O-D'

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

    Local $foo = Run(@ComSpec & " /c " & $sCMD, "", @SW_HIDE, $STDOUT_CHILD)
    Local $data
    While True
    $data &= StdoutRead($foo)
    If @error Then ExitLoop
    Sleep(25)
    WEnd

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

    Local $ret = StringRegExp($data, "(?:\d{2}\.\d{2}\.\d{4}\s+\d{2}:\d{2}\s+[0-9.]+\s)(.+)", 1)
    If IsArray($ret) Then MsgBox(0, 'Zuletzt geänderte Datei', $ret[0])

    [/autoit]
    • Offizieller Beitrag

    Hab noch eine wesentlich schnellere Variante:

    [autoit]

    Local $sFullPath = 'C:\test'
    If FileExists($sFullPath & '\Ergebnis.txt') Then FileDelete($sFullPath & '\Ergebnis.txt')
    Local $sCMD = 'DIR ' & $sFullPath & '/A-D-S /O-D /B >>' & $sFullPath & '\Ergebnis.txt'
    RunWait(@ComSpec & " /c " & $sCMD, "", @SW_HIDE)
    MsgBox(0, 'Zuletzt geänderte Datei', FileReadLine($sFullPath & '\Ergebnis.txt', 2)) ; Zeile 2 deshalb, weil die Ergebnisdatei (die Neuste) hier im selben Ordner liegt

    [/autoit]

    Edit:
    Du kannst es auch in eine hübsche Funktion packen. :D

    Spoiler anzeigen
    [autoit]

    Local $sFullPath = 'C:\test'
    MsgBox(0, 'Zuletzt geänderte Datei', _GetLastChgFile($sFullPath))

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

    Func _GetLastChgFile($sDirectory)
    If Not FileExists($sDirectory) Then Return SetError(1,0,0)
    Local $file = @TempDir & '\GetLastChgFile_tmp.txt'
    If FileExists($file) Then FileDelete($file)
    Local $sCMD = 'DIR ' & $sDirectory & '/A-D-S /O-D /B >>' & $file
    RunWait(@ComSpec & " /c " & $sCMD, "", @SW_HIDE)
    Local $sLastChg = FileReadLine($file, 1)
    FileDelete($file)
    Return $sLastChg
    EndFunc

    [/autoit]
  • mist, Umlaute im Dateinamen werden falsch ausgelesen. aus "ändern" wird "Žndern"
    liegt wohl am dir Befehl DIR und der codepage

    ich schau mal

    • Offizieller Beitrag

    mist, Umlaute im Dateinamen werden falsch ausgelesen. aus "ändern" wird "Žndern"


    Hängt mit ANSII/Unicode zusammen. Hab die Funktion mal um ein Replace ergänzt. Geht am Einfachsten. :whistling:

    [autoit]

    Func _GetLastChgFile($sDirectory)
    If Not FileExists($sDirectory) Then Return SetError(1,0,0)
    Local $aRepl[7][2] = [["„","ä"],["Ž","Ä"],["”","ö"],["™","Ö"],["","ü"],["š","Ü"],["á","ß"]]
    Local $file = @TempDir & '\GetLastChgFile_tmp.txt'
    If FileExists($file) Then FileDelete($file)
    Local $sCMD = 'DIR ' & $sDirectory & '/A-D-S /O-D /B >>' & $file
    RunWait(@ComSpec & " /c " & $sCMD, "", @SW_HIDE)
    Local $sLastChg = FileReadLine($file, 1)
    For $i = 0 To 6
    $sLastChg = StringReplace($sLastChg, $aRepl[$i][0], $aRepl[$i][1])
    Next
    FileDelete($file)
    Return $sLastChg
    EndFunc

    [/autoit]
  • Nö, hängt mit OEM <>Win-ANSI zusammen:

    [autoit]

    MsgBox(0, "Test", _OemToChar("Žndern"))
    Exit
    Func _OemToChar($Str)
    Local $aResult = DllCall("User32.dll", "Bool", "OemToChar", "Str", $Str, "Str", $Str)
    If @error Or $aResult[0] = 0 Then Return SetError(1, 0, "")
    Return $aResult[2]
    EndFunc

    [/autoit]