Dateien sortieren und löschen

  • Hallo zusammen,

    ich steh mal wieder auf der Leitung.
    Kann man mit Autoit dies umsetzen?

    In einem Verzeichnis habe ich Dateien die bis zur 12. Stelle den gleichen Namen haben und danach Unterschiede besitzen.

    Nun möchte ich pro Datei nur die aktuellste behalten und alle anderen löschen.

    Ein Beispiel:

    123456789112XXXXX.jpg (die ersten 12 Stellen sind gleich - XXX ist variabel - von dieser Familie soll die aktuellste - nach Datum - im Verzeichnis verbleiben)
    oder hier
    125380XXXXX.txt

    Wie kann man in so einem Verzeichnis aufräumen?

    Danke.

    Bis bald
    Leertaste

    Einmal editiert, zuletzt von leertaste (10. Dezember 2007 um 19:55)

  • Hi,

    bitte nicht gleich in der Luft zerfetzen, aber für einen nicht programmierenden Menschen......

    [autoit]

    #include <Date.au3>
    #include <Array.au3>
    #include <File.au3>

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

    $adiv = _FileListToArray("C:\TEMP\TEST\", "*.*") ; Dateien ins array
    If Not IsArray($adiv) Then Exit MsgBox(16, "", "Nichts gefunden.. EXIT!")
    For $i = 1 To $adiv[0]
    $dd = FileGetTime($adiv[$i], 1, 0) ; lesen Erstellungsdatum
    Next

    For $i = 1 To $adiv[0]
    If StringLeft($adiv[$i], 12) = "|" Then FileDelete("C:\TEMP\TEST\*.*" & $adiv[$i])
    Next

    [/autoit]

    Tut so als ob, aber nichts passiert.

    Ciao

  • klar kann das nicht gehen du hast die Dateien die älter sind ja nicht mit einem "|" markiert

    du müsstest jetzt noch dein nach Kriterium die Dateien mit "|" markieren

    [autoit]


    For $i = 1 To $adiv[0]
    $dd = FileGetTime($adiv[$i], 1, 0) ; lesen Erstellungsdatum
    ; Dateien markieren, die nicht verschoben werden sollen
    If $dd = Kriterium Then $adiv[$i] &= "|"
    Next

    [/autoit]
  • Hi,

    mh.... schwierig.

    Es soll ja nur die aktuellste Datei einer Dateifamilie vorhanden sein.

    Heisst dies man müsste nur die ersten 12 Stellen des Dateinamens in das array einlesen und dann das Erstellungsdatum hizufügen.

    Wie kann man den sagen, das die aktuellste Datei nicht markiert werden soll bzw. die älteren gelöscht werden sollen?

    Danke, Ciao

  • warum du fragst die die created Zeit mit FileGetTime ab und vergleichst die mit den anderen. Die Datei die am jüngsten ist wird nicht markiert.

  • was der bugfix meint ist in verlängerter form folgendes:
    also versuch ich mal mein bestes des zu erklären was ich vorschlagen möchte...
    IST Zustand:

    Spoiler anzeigen

    Die dateien werden hier in verkürtzer weise dargestellt mit datum wann diese erzeugt wurden...

    Code
    1.Datei am 12.02.04
    2.Datei am 15.07.05
    3.Datei am 16.07.05
    4.Datei am 21.03.06
    5.Datei am 12.02.07


    so jetzt wäre es erstmal sinnvoll zwei variablen anzulegen wo einmal das datum der jüngsten datei gespeicht ist und einmal der name der datei(muss aber net sein..) so jetzt musste prüfen ob datei 2 älter als datei 1 ist...in diesem beispiel wär es gut geeignet das datum erst zu splitten(StringSplit) und erst zu überprüfen ob sich zunächst das jahr unterscheidet...sollte jahr gleich sein kommt der monat und zu guter letzt der tag...als ergebniss sollte jedenfall datei 2 ermittelt werden da diese älter als datei 1 ist...diese werte werden jetzt in den variablen(die ganz am anfang erzeugt wurden) gespeichert...so jetzt wird ein praktischer effekt einer Zählschleife ausgenutzt -> einfach ausgedrückt heißt das jetzt wir schauen nun nach dem datum von datei 3 und prüfen ob diese datei älter ist als die werte die in den variablen(immer noch die die oben erzeugt wurden und mitlerweile von den werten von datei 2 überschrieben wurden) zurzeit stehen....da datei 3 älter als die datei 2 ist(die im zwischenspeicher steht) wird der zwischenspeicher(die variablen die am anfang erzeugt wurde) überschrieben und zwar mit den informationen der datei 3.....und so weiter bis alle dateien überprüft wurden...am ende werden alle dateien gelöscht die nicht den informationen im zwischenspeicher entsprechen....hier könnte man auch die variale mit dem namen weglassen denn es kann passieren dass zwei dateien am glechen tag erzeugt wurden und keine ältere vorhanden ist....welche von beiden dateien soll nun gelöscht werden??

    nun gut hoffe das war wenigstens ein wenig verständlich ansonsten bitte bescheid sagen per pn oder wie auch immer

    der snoozer

    PS: hab grad erst gesehen das bugfix schon gepostet hat...so nen text zu schreiben dauert nen weilchen....

    • Offizieller Beitrag

    Hi,

    wenn du dies laufen läßt, dann hast du deine Files folgendermaßen vorliegen:

    $new_A[1][0] = Dateiname
    $new_A[1][1] = Datum (created)

    Das ganze absteigend sortiert.

    Du mußt jetzt "nur noch" hingehen und eine gucken : Ist eine Datei im Array wo die ersten 12 Stellen gleich sind, dann löschen. und dann zur nächsten Datei hüpfen.

    Spoiler anzeigen
    [autoit]

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

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

    $FileList = _FileListToArray(@ScriptDir, '*.jpg', 1)
    If @error = 1 Then
    MsgBox(0, "", "No Files\Folders Found.")
    Exit
    EndIf

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

    Global $new_A[UBound($FileList) ][2]

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

    For $i = 1 To UBound($FileList) - 1
    $new_A[$i][0] = $FileList[$i]
    $new_A[$i][1] = FileGetTime(@ScriptDir & "\" & $FileList[$i], 1, 1)
    Next
    _ArraySort($new_A, 0, 0, 0, 2, 1)

    [/autoit]

    So long,

    Mega

  • Hi,

    leider gelingt es mir nicht die Dateien zu löschen.

    Es sollen nur Dateinamen die mehr als 12 Zeichen haben verglichen werden, ob mehrfach vorhanden, und dann soll die jüngste erhalten bleiben.

    Wo liegt mein Fehler?

    Spoiler anzeigen
    [autoit]

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

    $path1 = "C:\Dokumente und Einstellungen\All Users\Dokumente"
    $path2 = "C:\Dokumente und Einstellungen\All Users\Dokumente\old"

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

    $FileList = _FileListToArray($path1 & "\", '*.jpg', 1)
    If @error = 1 Then
    MsgBox(0, "", "No Files\Folders Found.")
    Exit
    EndIf

    Global $new_A[UBound($FileList) ][2]

    For $i = 1 To UBound($FileList) - 1
    $new_A[$i][0] = $FileList[$i]
    $new_A[$i][1] = FileGetTime($path1 & "\" & $FileList[$i], 1, 1)
    Next
    _ArraySort($new_A, 1, 1, 0, 2, 0)
    ;_ArrayDisplay($new_A, "Dateiliste")

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

    For $i = 1 To UBound($FileList) - 1
    If Stringlen($new_A[$i][0]) > 12 Then $new_A[$i][0] = StringLeft($new_A[$i][0], 12)
    If $new_A[$i][1] > $new_A[$i][1] then $FileList[$i] &= "|"
    Next

    For $i = 1 To UBound($FileList) - 1
    If $new_A[$i][0] <> "|" Then FileMove($path1 & "\" & $new_A[$i][0], $path2)
    Next

    [/autoit]

    Danke für eure Hilfe.

    ciao

  • Hallo zusammen,


    jetzt versuchte ich mal Schritt für Schritt auszuführen, ohne gleich die 2. Spalte des arrays ins spiel zu bringen. Klappte aber auch nicht.

    Hier sollten alle Dateien verschoben werden deren Dateiname weniger als 12 Stellen hat.

    Leider wieder kein Erfolg......, bin am verzweiflen.

    Spoiler anzeigen
    [autoit]

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

    $path1 = "C:\Dokumente und Einstellungen\All Users\Dokumente"
    $path2 = "C:\Dokumente und Einstellungen\All Users\Dokumente\old"

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

    $FileList = _FileListToArray($path1 & "\", '*.jpg', 1)
    If @error = 1 Then
    MsgBox(0, "", "No Files\Folders Found.")
    Exit
    EndIf

    Global $new_A[UBound($FileList) ][2]

    For $i = 1 To UBound($FileList) - 1
    $new_A[$i][0] = $FileList[$i]
    $new_A[$i][1] = FileGetTime($path1 & "\" & $FileList[$i], 0, 1)
    Next
    _ArraySort($new_A, 1, 1, 0, 2, 0)
    ;_ArrayDisplay($new_A, "Dateiliste")

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

    For $i = 1 To UBound($FileList) - 1
    If $i = Stringlen($new_A[$i][0]) < 12 Then $new_A[$i][0] &= "|"
    Next

    For $i = 1 To UBound($FileList) - 1
    If $i = $new_A[$i][0] = "|" Then FileMove($path1 & "\" & $new_A[$i][0], $path2)
    Next

    [/autoit]

    Schönen Sonntag

    leertaste