Dateien zählen und löschen

  • Hallochen allerseits, ein einem Ordner wird jeden Tag eine Sicherungsdatei erstellt. Ich möchte das nur jeweils die 5 jüngsten Sicherungen erhalten und der Rest soll gelöscht werden.

    Der Ablauf könnte vielleicht so aussehen:

    • Alles vorhandenen Zählen und so die Größe eines Arrays bestimmen
    • über FileGetTime das Array füllen
    • das Array sortieren von jung nach alt:thumbup:
    • alle Dateien die älter als 5 sind werden gelöscht.


    Fragen:

    1. wie kann die Anzahl der Dateien bestimmt werden?
    2. kann ein Array derartig sortiert werden?

    Danke für jede Hilfe

    Stefan

  • Der Knackpunkt liegt in erster Linie wohl in der Sortierung nach Datum.

    Für den Fall bietet es sich an eine eigene Sortierung zu basteln welche anstatt (im konkreten Fall) den Dateinamen das Dateidatum vergleicht.

    Um das ganze zu vereinfachen habe ich mal eine entsprechende Sortierfunktion geschrieben, bei welcher man lediglich die Vergleichsfunktion durch was eigenes ersetzen kann.
    Damit wird dann ein individuelles Sortieren deutlich einfacher.
    Diese "_ArraySortFlexible" findet sich in der DynArray-UDF.
    Damit könnte der Rumpf als Ansatz ungefähr so aussehen (hab hier kein AutoIt - daher können noch Fehler drin sein):

    Nun zu den Saucen ;): Ich habe vom Steakgaren etwas Fleischsaft. Nicht viel - da Sous-Vide gegart - aber halt ein bisschen.
    Reicht das als Grundlage für eine Sauce oder müsste ich eher noch extern was dazu auskochen?

    2 Mal editiert, zuletzt von AspirinJunkie (8. Februar 2018 um 20:47)

  • Hallo Schleifchen !

    Damit könnte der Rumpf als Ansatz ungefähr so aussehen (hab hier kein AutoIt - daher können noch Fehler drin sein):

    Ja, da gibt es einige Kleinigkeiten die nicht funktionieren - beim Blindtippen ohne AutoIt verständlich ;).


    Hier mal eine Standardvariante :

    Falls Du nicht das Erstellungsdatum, sondern das Datum der letzten Änderung verwenden möchtest, dann :

    $FT_CREATED durch $FT_MODIFIED ersetzen.

    Edit : File hochgeladen


    Gruß Musashi

    Dateien

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    Einmal editiert, zuletzt von Musashi (8. Februar 2018 um 09:12)

  • Hallo Schleifchen !

    Nachtrag : Hier eine erweiterte Version, die auch das Löschen durchführt.

    UNBEDINGT darauf achten, dass Du das korrekte Verzeichnis verwendest, sonst gehen ggf. wichtige Daten verloren !

    -> Es erfolgt eine Sicherheitsabfrage vor dem Löschen

    -> die ConsoleWrite Anweisungen dienen zur Info

    Gruß Musashi

    EDIT am 07. September 2019, 21:40 (Danke an Professor Bernd für den Hinweis) :

    In der Downloadvariante des Skriptes war ein Tippfehler enthalten -> gefixt

    (vorher 50 Mal heruntergeladen, zuletzt: 07. September, 2019 18:06)

    Dateien

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    2 Mal editiert, zuletzt von Musashi (7. September 2019 um 21:38) aus folgendem Grund: kleine Korrektur in der Downloaddatei

  • Hallo Musashi,

    Code
    Global $sFilePath = @ScriptDir & C:\Users\Stefan\Downloads\OneDrive-2018-02-08 ; hier den gewünschten Pfad ohne abschließenden \ angeben
       #ce der Pfad funzt nicht:
       hier die Fehlermeldung:
                               C:\Users\Stefan\Desktop\Posbill_Sicherung_loeschen.au3 (5) : ==> Unable to parse line.: 
       aber auch mit nur C:\Users\Stefan\Downloads\OneDrive-2018-02-08 erscheint ne Fehlermeldung. Wo liegt die Ursache?
       #cs

    Der Pfad ist aus der Explorerleiste kopier, also keine Schreibfehler. Und warum wird @ScriptDir und Pfad verknüpft?

    Danke

    Stefan

  • @ScriptDir beinhaltet schon den absoluten Pfad bis zum Skriptverzeichnis.

    Dein endgültiger Pfad schaut ungefähr so aus "C:\Users\blabla\Desktop\AutoIt-Skriptverzeichnis\C:\Users\Stefan\Downloads\....".

    Entferne einfach das @ScriptDir & und es sollte laufen. Am besten nimmst du aber einen FileOpenDialog dafür, dann kannst du bei jedem Skriptstart die Datei auswählen.

  • Code
    Global $sFilePath = C:\Users\Stefan\Desktop\OneDrive-2018-02-08 ; hier den gewünschten Pfad ohne abschließenden \ angeben
    Code
    >"C:\Program Files (x86)\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "C:\Users\Stefan\Desktop\Posbill_Sicherung_loeschen.au3"    
    C:\Users\Stefan\Desktop\Posbill_Sicherung_loeschen.au3 (5) : ==> Unable to parse line.: 
    Global $sFilePath = C:\Users\Stefan\Desktop\OneDrive-2018-02-08 
    Global $sFilePath = C:^ ERROR

    Tut mir leid, habe jetzt den Pfad wie oben eingesetzt. Bis C: scheint alles glatt zu laufen, aber warum nicht weiter???? Der Ordner liegt auf dem Desktop....

  • Dann gib doch als Pfad an:

    Global $sFilePath = "C:\Users\Stefan\Desktop\OneDrive-2018-02-08" & "\Posbill_Sicherung_loeschen.au3"

    oder was auch geht, wäre

    $Pfad = "C:\Users\Stefan\Desktop\OneDrive-2018-02-08"

    $Datei = "Posbill_Sicherung_loeschen.au3"

    Global $sFilePath =$Pfad & "\" & $Datei

    Nimm einfach was dir am besten gefällt.

    Dann flutscht es normalerweise.

  • Hallo Schleifchen !

    Tuxedo :

    Schleifchen möchte die 5 neuesten Dateien in einem Verzeichnis behalten, und die älteren löschen.

    Die Angabe eines Pfadnamens MIT anschließendem Dateinamen funktioniert nicht und ist zudem unnötig, da _FileListToArrayRec nur einen Verzeichnisnamen (ohne abschließenden \) benötigt.

    Es muss also nur ein Pfad angegeben werden, der, wie alpines bereits schrieb, in Anführungszeichen gesetzt werden sollte, also z.B. : $sFilePath = "c:\MeinOrdner"

    Ich habe im Skript @ScriptDir & '\Testdateien' nur zur Sicherheit verwendet, damit man nicht aus Versehen in einem wichtigen Verzeichnis löscht.

    Schleifchen benötigt also $sFilePath = "C:\Users\Stefan\Desktop\OneDrive-2018-02-08" 

    Alternativ könnte man das Verzeichnis auch über einen Dialog besetzen. Dazu in das obige Skript folgendes einfügen :

    AutoIt
    ; Zeigt einen 'Verzeichnis-Öffnen-Dialog an '
    $sFilePath = FileSelectFolder('Bitte Ordner auswählen', '')
    If @error Then
        ConsoleWrite('! Fehler bei Verzeichniswahl : ' & @error & @CRLF)
        Exit
    Else
        ConsoleWrite('> gewähltes Verzeichnis = ' & $sFilePath & @CRLF)
    EndIf

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Wie kommt ihr eigentlich alle auf _FileListToArrayRec?
    Von Dateien in Unterordnern hat er doch gar nix geschrieben?

    Ich habe übrigens mein Beispiel oben mal angepasst da mir AutoIt wieder zur Verfügung steht.

  • Hallo AspirinJunkie !

    Wie kommt ihr eigentlich alle auf _FileListToArrayRec?
    Von Dateien in Unterordnern hat er doch gar nix geschrieben?

    Da hast Du recht !

    Wenn man bei _FileListToArray den optionalen Parameter 4 , also $bReturnPath , auf True setzt, wird auch der komplette Pfad zur Datei angegeben.

    Damit kann man sich _FileListToArrayRec mit dem Parameter $FLTAR_NORECUR sparen, und gleich :

    $aFileList = _FileListToArray($sFilePath, "*", $FLTA_FILES, True)

    verwenden. Schaden anrichten tut die andere Variante aber nicht.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Auch wenn der Beitrag schon auf gelöst steht ich sehe da eigentlich einen einfacheren Weg.

    Man lege Ordner an - Ordnername = dayof the year (das ist eine aufsteigende Zahl von 001 bis 365). Nun kann man bequem in den Ordner mit dem Datum des aktuellen befüllen und die 1 2 3 4 5 6 7.. Tage alten Ordner löschen - oder je nach Backupsoftware die Inhallte überschreiben.

    Das System ist simpl und absolut narrensicher. Auch an TAgen wie heute :)

    Gruß

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Hallo, verstehe ich nich so ganz :-/ . Es handelt sich um Dateien die von einem Kassenprogramm täglich automatisch angelegt werden. Sie beinhalten alle Kassenbewegungen seit Installation und haben mittlerweile die Größe von 350MB je Datei. Der Dateiname (PosBill_BackUp-180205.mdb) lässt sich nicht beeinflussen, lediglich der Sicherungsordner, der aber immer der gleiche ist.

    Stefan

  • Hallo Schleifchen !

    Hallo, verstehe ich nich so ganz :-/

    Meinst Du den Beitrag #16 von Peter S. Taler , oder was genau verstehst Du nicht.

    Dein ursprüngliches Anliegen war ja, die 5 neuesten Dateien in einem Verzeichnis zu behalten, und die älteren zu löschen (sofern vorhanden). Das funktioniert mit meinem Skript einwandfrei, solange Du den Verzeichnisnamen, wie von verschiedener Seite beschrieben, korrekt besetzt.

    Was das Löschen von Dateien z.B. verhindern kann ist, dass diese Datei zur Zeit verwendet wird.

    Ggf. könntest Du Dein Problem noch mal etwas genauer beschreiben.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Zitat

    Man lege Ordner an - Ordnername = dayof the year (das ist eine aufsteigende Zahl von 001 bis 365).

    Darauf bezog meine Ansage. Dein Code funzt perfekt. Der Pfad ist nun richtig gesetzt...

  • Hallo AspirinJunkie !

    Ich habe dein überarbeitetes Skript ausgeführt, mit folgendem Ergebnis :

    Array vor der Sortierung :

    SortName.png

    Array nach der Sortierung :

    SortDate.png

    Wie Du siehst, verändert sich durch die Sortierung nichts :/. Möglicherweise habe ich da aber auch etwas falsch verstanden. Die Dateien haben unterschiedliche Erstellungs- und Änderungsdaten - bei meinem Skript läuft das Sortieren korrekt ab. Vielleicht kannst Du das noch mal checken.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."