Verzeichnis einlesen und Dateien löschen

Anfängerfragen zum Programmieren mit PureBasic.
Micro
Beiträge: 59
Registriert: 28.12.2006 17:44
Computerausstattung: Intel 10850K, 16GB RAM
div. andere Rechner...
Wohnort: Nordkirchen

Verzeichnis einlesen und Dateien löschen

Beitrag von Micro »

Hallo Leute,

ich habe mal wieder ein kleines Problem.

Ich möchte ein Verzeichnis einlesen und die Dateien darin sortieren. Wenn mehr als (sagen wir mal) 200 Dateien darin sind, möchte ich die ältesten Dateien löschen.
Gedanklich war ich schon dabei, den Verzeichnisinhalt in ein Array reinzuschreiben und die zu sortieren. Danach wollte ich die Dateien, die nicht im Array stehen, löschen lassen. Ist aber dämlich, da ich dann das Verzeichnis ja 2x durchlaufen lassen muss (denke ich).

Hat da jemand nen Codeschnipsel für mich, den ich verwenden darf?

Gruß Micro
PB 5.73 LTS - Win 11 Pro / 64Bit
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Verzeichnis einlesen und Dateien löschen

Beitrag von ts-soft »

> Ist aber dämlich, da ich dann das Verzeichnis ja 2x durchlaufen lassen muss (denke ich).
Wäre wirklich dämlich wenn Du das müßtest, ich wüßte nicht warum.
Für rekursive mußte mal suchen, nicht rekursiv sollte ganz einfach sein.
Einfach das Beispiel aus der Hilfe nehmen, Namen, Größe und Datum in eine strukturierte
Linklist, usw. am ende anhand der Namen in der Liste einfach löschen.

Happy Niclas
Thomas
Micro
Beiträge: 59
Registriert: 28.12.2006 17:44
Computerausstattung: Intel 10850K, 16GB RAM
div. andere Rechner...
Wohnort: Nordkirchen

Re: Verzeichnis einlesen und Dateien löschen

Beitrag von Micro »

Hi Thomas,

ich danke Dir sehr herzlich für für Deinen Tipp. Hab's jetzt hinbekommen. Den Dreh mit dem SortStructuredList() hat mir gefehlt.
Hier mal (für die Nachwelt :-)) mein (bestimmt) verbesserungswürdiges Script:

Code: Alles auswählen

; Verzeichnis mit den Bildern des Typs *.png
Directory.s = "C:\Temp\Temp\"
; Anzahl der Bilder, die nicht gelöscht werden sollen
Number.l = 15

AnzahlBilder.l = 0
If ExamineDirectory(0, Directory.s, "*.png")  
  While NextDirectoryEntry(0)
    AnzahlBilder.l = AnzahlBilder.l + 1
  Wend
  FinishDirectory(0)
EndIf

Structure Bilder
  Name$
  Nummer.l
EndStructure
NewList Bildarray.Bilder()

X = 1
If ExamineDirectory(0, Directory.s, "*.png")  
  While NextDirectoryEntry(0)
      AddElement(Bildarray())
      Bildarray()\Nummer = X
      Bildarray()\Name$ = DirectoryEntryName(0)
      X = X + 1
  Wend
  FinishDirectory(0)
EndIf

SortStructuredList(Bildarray(), 0, OffsetOf(Bilder\Name$), #PB_Sort_Long)

ForEach Bildarray()
   If Bildarray()\Nummer <= AnzahlBilder.l - Number.l
     Ergebnis = DeleteFile(Directory.s + Bildarray()\Name$)
     If Ergebnis = 0
       MessageRequester("Hinweis", "Datei " + Bildarray()\Name$ + " konnte nicht gelöscht werden!", #MB_ICONWARNING)
       End
     EndIf

    Debug Bildarray()\Name$ + " Nummer: " + Str(Bildarray()\Nummer) + "wurde gelöscht"
  Else
    Debug Bildarray()\Name$ + " Nummer: " + Str(Bildarray()\Nummer) + "wurde nicht gelöscht"
  
  EndIf
Next
Vielleicht kann der eine oder andere davon mal was gebrauchen....


Gruß Frank
PB 5.73 LTS - Win 11 Pro / 64Bit
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Verzeichnis einlesen und Dateien löschen

Beitrag von Kiffi »

Hallo Frank,

danke, dass Du Deine Lösung für die Allgemeinheit hier veröffentlicht hast.
Macht nicht jeder...

kleiner Tipp noch: Bildarray()\Nummer brauchst Du nicht unbedingt. Die
Position kannst Du auch mit ListIndex(Bildarray()) ermitteln.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Verzeichnis einlesen und Dateien löschen

Beitrag von NicTheQuick »

Das hier sieht aber auch falsch aus:

Code: Alles auswählen

SortStructuredList(Bildarray(), 0, OffsetOf(Bilder\Name$), #PB_Sort_Long)
Du sortierst nach dem String 'Bilder\Name$', aber sagst der Funktion, dass es ein Long wäre (#PB_Sort_Long).
Außerdem dachte ich du wolltest die ältesten Dateien löschen. Dann müsstest du aber nach dem Datum sortieren und das vorher auch entsprechend auslesen.

Und weil ich gerade dabei bin: Wieso zählst du in der ersten Schleife die Bilder, wenn du das genau so gut in der zweiten machen kannst? Dann musst du nicht unnötig zweimal über's Verzeichnis iterieren.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Verzeichnis einlesen und Dateien löschen

Beitrag von Bisonte »

NicTheQuick hat geschrieben:Das hier sieht aber auch falsch aus:

Code: Alles auswählen

SortStructuredList(Bildarray(), 0, OffsetOf(Bilder\Name$), #PB_Sort_Long)
Du sortierst nach dem String 'Bilder\Name$', aber sagst der Funktion, dass es ein Long wäre (#PB_Sort_Long).
Außerdem dachte ich du wolltest die ältesten Dateien löschen. Dann müsstest du aber nach dem Datum sortieren und das vorher auch entsprechend auslesen.
Gedanklich war er wohl schon beim Timestamp und der Sortierung ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Micro
Beiträge: 59
Registriert: 28.12.2006 17:44
Computerausstattung: Intel 10850K, 16GB RAM
div. andere Rechner...
Wohnort: Nordkirchen

Re: Verzeichnis einlesen und Dateien löschen

Beitrag von Micro »

Tach auch...
Bisonte hat geschrieben:
NicTheQuick hat geschrieben:Das hier sieht aber auch falsch aus:

Code: Alles auswählen

SortStructuredList(Bildarray(), 0, OffsetOf(Bilder\Name$), #PB_Sort_Long)
Du sortierst nach dem String 'Bilder\Name$', aber sagst der Funktion, dass es ein Long wäre (#PB_Sort_Long).
Außerdem dachte ich du wolltest die ältesten Dateien löschen. Dann müsstest du aber nach dem Datum sortieren und das vorher auch entsprechend auslesen.
Gedanklich war er wohl schon beim Timestamp und der Sortierung ;)
Naja, was ich dabei verschwiegen habe: Die Bilder werden auch von mir erstellt und haben automatisch das Datum als Dateinamen. Z.B. heißen die Dateien 20091207-235042.png, 20091207-235242.png, etc. Deswegen ist der Timestamp der Datei auch gleich der Dateiname. Man(n) macht sich das so einfach wie möglich, hehehe....

@NicTheQuick, stimmt auffallend. Hab' nur festgestellt, das in diesem Fall es völlig egal ist, was ich da reinschreibe. Ob #PB_Sort_String oder #PB_Sort_Long, es kommt das gleiche bei raus.

Falls es euch interessiert: Ihr findet den Quellcode hier im Forum unter: http://www.purebasic.fr/german/viewtopi ... 11&t=21416


Gruß Frank
PB 5.73 LTS - Win 11 Pro / 64Bit
Micro
Beiträge: 59
Registriert: 28.12.2006 17:44
Computerausstattung: Intel 10850K, 16GB RAM
div. andere Rechner...
Wohnort: Nordkirchen

Re: Verzeichnis einlesen und Dateien löschen

Beitrag von Micro »

Hi Kiffi,
Kiffi hat geschrieben:Hallo Frank,

danke, dass Du Deine Lösung für die Allgemeinheit hier veröffentlicht hast.
Macht nicht jeder...

kleiner Tipp noch: Bildarray()\Nummer brauchst Du nicht unbedingt. Die
Position kannst Du auch mit ListIndex(Bildarray()) ermitteln.

Grüße ... Kiffi
keine Frage. Wenn ich bedenke, das in der Zeit seid ich mich hier angemeldet habe, in erster Linie Du mir bei meinen Problemen geholfen hast, ist das wohl ein kleiner Ausgleich (denke ich). Bis jetzt habt Ihr alle es immer geschafft, das ich eine komplette Lösung von euch bekommen habe, egal was war. Und ich denke mir, das wenn ich schon ein Lösungsansatz von euch bekomme, ich dann auch mal meine Lösung hinsetzten sollte. Wie sagt man(n) doch noch: geben und nehmen... ?

In diesem Sinne....

Gruß Frank
PB 5.73 LTS - Win 11 Pro / 64Bit
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Verzeichnis einlesen und Dateien löschen

Beitrag von NicTheQuick »

Micro hat geschrieben:@NicTheQuick, stimmt auffallend. Hab' nur festgestellt, das in diesem Fall es völlig egal ist, was ich da reinschreibe. Ob #PB_Sort_String oder #PB_Sort_Long, es kommt das gleiche bei raus.
Leider stimmt das so nicht. Das ist reiner Zufall. Die Sortierungsfunktion sortiert bei dir im Grunde nur die Pointer zu den Strings, indem er sie als Zahlen interpretiert. Vermutlich liegen die Dateien in der Dateistruktur der Festplatte zufällig schon richtig sortiert und wenn er sie dann in die LinkedList einreiht, sind die Pointer zu gespeicherten Strings aufsteigend sortiert, weil Windows nach und nach von vorne nach hinten Speicher alloziert. Das das also Blödsinn ist, muss ich nicht weiter erläutern...
Also mach es lieber gleich richtig, bevor du noch ein böse Überraschung erlebst, weil es nicht so funktioniert wie du denkst.

Ich hoffe der Beitrag kam jetzt nicht irgendwie schlecht rüber.
Antworten