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

  • _FileListToArray spuckt dir in einem Array alle Dateien in einem Verzeichnis aus. _FileListToArrayRec sogar für Unterverzeichnisse.

    Für das Sortieren kannst du _ArraySort verwenden oder etwas eigenes schreiben.


    Gab letztens einen Thread zum Löschen von jüngsten Dateien, vielleicht kriegste das ja abgeändert: Jüngste Datei löschen

  • 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?

  • 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

    • _FileSort.au3

      (1,13 kB, 26 Mal heruntergeladen, zuletzt: )

    "Die Definition von Wahnsinn ist, immer wieder das Gleiche zu tun und andere Ergebnisse zu erwarten." - Albert Einstein

    Einmal editiert, zuletzt von Musashi ()

  • 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

    Dateien

    • _FileSortV2.au3

      (2,25 kB, 31 Mal heruntergeladen, zuletzt: )

    "Die Definition von Wahnsinn ist, immer wieder das Gleiche zu tun und andere Ergebnisse zu erwarten." - Albert Einstein

  • Hallo Musashi,

    Code
    1. Global $sFilePath = @ScriptDir & C:\Users\Stefan\Downloads\OneDrive-2018-02-08 ; hier den gewünschten Pfad ohne abschließenden \ angeben
    2. #ce der Pfad funzt nicht:
    3. hier die Fehlermeldung:
    4. C:\Users\Stefan\Desktop\Posbill_Sicherung_loeschen.au3 (5) : ==> Unable to parse line.:
    5. aber auch mit nur C:\Users\Stefan\Downloads\OneDrive-2018-02-08 erscheint ne Fehlermeldung. Wo liegt die Ursache?
    6. #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
    1. Global $sFilePath = C:\Users\Stefan\Desktop\OneDrive-2018-02-08 ; hier den gewünschten Pfad ohne abschließenden \ angeben
    Code
    1. >"C:\Program Files (x86)\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "C:\Users\Stefan\Desktop\Posbill_Sicherung_loeschen.au3"
    2. C:\Users\Stefan\Desktop\Posbill_Sicherung_loeschen.au3 (5) : ==> Unable to parse line.:
    3. Global $sFilePath = C:\Users\Stefan\Desktop\OneDrive-2018-02-08
    4. 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 :

    Code
    1. ; Zeigt einen 'Verzeichnis-Öffnen-Dialog an '
    2. $sFilePath = FileSelectFolder('Bitte Ordner auswählen', '')
    3. If @error Then
    4. ConsoleWrite('! Fehler bei Verzeichniswahl : ' & @error & @CRLF)
    5. Exit
    6. Else
    7. ConsoleWrite('> gewähltes Verzeichnis = ' & $sFilePath & @CRLF)
    8. EndIf


    Gruß Musashi

    "Die Definition von Wahnsinn ist, immer wieder das Gleiche zu tun und andere Ergebnisse zu erwarten." - Albert Einstein

  • 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

    "Die Definition von Wahnsinn ist, immer wieder das Gleiche zu tun und andere Ergebnisse zu erwarten." - Albert Einstein

  • 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 Suchmaschienen 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.

  • 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

    "Die Definition von Wahnsinn ist, immer wieder das Gleiche zu tun und andere Ergebnisse zu erwarten." - Albert Einstein

  • 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

    "Die Definition von Wahnsinn ist, immer wieder das Gleiche zu tun und andere Ergebnisse zu erwarten." - Albert Einstein