Seite 1 von 1
Verzeichnis einlesen und Dateien löschen
Verfasst: 06.12.2009 21:27
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
Re: Verzeichnis einlesen und Dateien löschen
Verfasst: 06.12.2009 21:38
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
Re: Verzeichnis einlesen und Dateien löschen
Verfasst: 07.12.2009 11:10
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
Re: Verzeichnis einlesen und Dateien löschen
Verfasst: 07.12.2009 11:25
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
Re: Verzeichnis einlesen und Dateien löschen
Verfasst: 07.12.2009 14:07
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.
Re: Verzeichnis einlesen und Dateien löschen
Verfasst: 07.12.2009 19:54
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

Re: Verzeichnis einlesen und Dateien löschen
Verfasst: 08.12.2009 01:16
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
Re: Verzeichnis einlesen und Dateien löschen
Verfasst: 08.12.2009 01:22
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
Re: Verzeichnis einlesen und Dateien löschen
Verfasst: 08.12.2009 04:25
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.