Verzeichnis einlesen und Dateien löschen
-
- 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
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
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
- 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
> 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
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
-
- 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
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:
Vielleicht kann der eine oder andere davon mal was gebrauchen....
Gruß Frank
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

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
Gruß Frank
PB 5.73 LTS - Win 11 Pro / 64Bit
Re: Verzeichnis einlesen und Dateien löschen
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
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²
- 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
Das hier sieht aber auch falsch aus:
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.
Code: Alles auswählen
SortStructuredList(Bildarray(), 0, OffsetOf(Bilder\Name$), #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.
Re: Verzeichnis einlesen und Dateien löschen
Gedanklich war er wohl schon beim Timestamp und der SortierungNicTheQuick hat geschrieben:Das hier sieht aber auch falsch aus:Du sortierst nach dem String 'Bilder\Name$', aber sagst der Funktion, dass es ein Long wäre (#PB_Sort_Long).Code: Alles auswählen
SortStructuredList(Bildarray(), 0, OffsetOf(Bilder\Name$), #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.

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
-
- 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
Tach auch...
@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
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....Bisonte hat geschrieben:Gedanklich war er wohl schon beim Timestamp und der SortierungNicTheQuick hat geschrieben:Das hier sieht aber auch falsch aus:Du sortierst nach dem String 'Bilder\Name$', aber sagst der Funktion, dass es ein Long wäre (#PB_Sort_Long).Code: Alles auswählen
SortStructuredList(Bildarray(), 0, OffsetOf(Bilder\Name$), #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.
@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
-
- 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
Hi Kiffi,
In diesem Sinne....
Gruß Frank
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... ?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
In diesem Sinne....
Gruß Frank
PB 5.73 LTS - Win 11 Pro / 64Bit
- 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
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...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.
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.