ExamineDirectory sortiert Ergebnisse nicht

Anfängerfragen zum Programmieren mit PureBasic.
Jet1199
Beiträge: 29
Registriert: 06.03.2005 00:33

ExamineDirectory sortiert Ergebnisse nicht

Beitrag von Jet1199 »

Hallo Community,

ich lese aus einem gegebenen Verzeichnis die Unterverzeichnisse ein und zeige sie in einem Gadget an

Code: Alles auswählen

    If ExamineDirectory(0, Directory$, "*.")  
      While NextDirectoryEntry(0)
        If DirectoryEntryType(0) <> #PB_DirectoryEntry_File
          If DirectoryEntryName(0)<>"." And DirectoryEntryName(0)<>".."   ; root und .. ausblenden
            AddGadgetItem (0, -1, DirectoryEntryName(0))   ; Listview-Eintrag hinzufügen
            SetGadgetState(0, 9)    ; wir setzen (beginnend bei 0) den zehnten Eintrag als aktiven
          EndIf
        EndIf    
      Wend
    EndIf
    FinishDirectory(0)
Die Daten in der sich füllenden Liste sind aber unsortiert. Läßt sich ganz bestimmt alphabetisch erledigen.

Leider blieben all meine bisherigen Recherchen ergebnislos und ich bemühe Euch nun (wiedermal). Dafür danke ich im Voraus!

Edit by NictheQuick: Code-Tags gesetzt
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: ExamineDirectory sortiert Ergebnisse nicht

Beitrag von Kiffi »

Jet1199 hat geschrieben:Läßt sich ganz bestimmt alphabetisch erledigen.
japp. Einfach innerhalb der While-Wend-Schleife eine LinkedList befüllen.
Diese kannst Du dann mit SortList() oder SortStructuredList() sortieren
lassen und danach damit Dein ListView füllen.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: ExamineDirectory sortiert Ergebnisse nicht

Beitrag von STARGÅTE »

@Jet1199

Du bist seit 6 Jahren in diesem Forum angemeldet und kennst keine Code-Tags ?

ExamineDirectory gibt bei mir immer eine nach dem Alphabet sortierte (ohne groß/kein) Liste zurück.

Es wäre zu dem nett, wenn du mal den ganzen Code zeigen würdest, es würde mich nämlich interessieren wie diese "unsortierte" Liste aussieht in deinem Gadget, weil ich mir wie schon gesagt nicht vorstellen kann das sie unsortiert ist.

Ansonsten Kiffis Vorschlag benutzen.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
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: ExamineDirectory sortiert Ergebnisse nicht

Beitrag von NicTheQuick »

Bei mir ist die Dateiliste auch immer unsortiert. Die Dateien werden üblicherweise genau in der Reihenfolge ausgegeben, wie sie in der MFT stehen.
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Re: ExamineDirectory sortiert Ergebnisse nicht

Beitrag von TomS »

Das passiert sporadisch.
Hatte ich auch schonmal.
Auch der Windows-Explorer zeigt nicht immer alles alphabetisch sortiert an, auch wenn das Häkchen bei "Sortieren nach Name" gesetzt ist... :bluescreen:
Jet1199
Beiträge: 29
Registriert: 06.03.2005 00:33

Re: ExamineDirectory sortiert Ergebnisse nicht

Beitrag von Jet1199 »

NicTheQuick hat geschrieben:Bei mir ist die Dateiliste auch immer unsortiert. Die Dateien werden üblicherweise genau in der Reihenfolge ausgegeben, wie sie in der MFT stehen.
Danke erstmal für die bisherigen, turbomäßigen Antworten.
Es brruhigt mich, daß einige dieses Problem nachvollziehen können. Ja, unsortiert ist immer wie in der MFT, d.h. es muß nichtmal eine zeitliche Sortierung sein.

@STARGÅTE:
Du hast Recht, ich bin schon lange dabei, aber weniger aus Spaß an der Freude, sondern aus Notwendigkeit. Eben immer mal wieder kleine Tools. So bin ich bis heute zwar Vollversionsinhaber seit vielen Jahren, aber immernoch Anfänger auf unterem Level.
So habe ich mir noch kein KnowHow zu Codetags angeeignet, was aber sicherlich zweckdienlich sein würde.
Den Code per Zwischenablage abzuwerfen ist also nicht der beste Weg. Aber wie müßte ich das Ergebnisfenster präsentieren (was ja nun sicherlich überflüssig ist?)

@Kiffi:
Ups, LinkedLists sind Neuland, das schaffe ich heute doch nicht mehr. Wenn sich dieser Umweg nicht umgehen läßt, werde ich mich damit auseinandersetzen. Danke für die schnellste Antwort :-)
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: ExamineDirectory sortiert Ergebnisse nicht

Beitrag von Kiffi »

Jet1199 hat geschrieben:Ups, LinkedLists sind Neuland
na, dann wird's aber höchste Eisenbahn! :-)

PureBasic -- Eine Einführung in die Computer-Programmierung

Seite 57 ff.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: ExamineDirectory sortiert Ergebnisse nicht

Beitrag von STARGÅTE »

NicTheQuick hat geschrieben:Bei mir ist die Dateiliste auch immer unsortiert. Die Dateien werden üblicherweise genau in der Reihenfolge ausgegeben, wie sie in der MFT stehen.
Bei mir ist die Dateiliste auch immer unsortiert. Die Dateien werden üblicherweise genau in der Reihenfolge ausgegeben, wie sie in der MFT stehen.
Hm sry, das kann ich nicht nachvollziehen.
Bei mir sind wirklich alle Verzeichnisse die ich mit ExamineDirectory auslese, alphabetisch Sortiert!
Das kann nicht "Zufall" sein.

Natürlich müssen Namen mit Sonderzeichen extra betrachtet werden, da sie in ExamineDirectory anders sortiert werden als mit SortList()

Code: Alles auswählen

CreateRegularExpression(0, "^[a-zA-Z0-9]*$")

Procedure.s Check(Dir$)
 Static Unsortiert, Summe
 Protected Dir = ExamineDirectory(#PB_Any, Dir$, "")
 Protected NewList Unsort.s(), NewList Sort.s()
 If Dir
  Summe + 1
  While NextDirectoryEntry(Dir)
   If DirectoryEntryName(Dir) <> "." And DirectoryEntryName(Dir) <> ".."
    AddElement(Unsort()) : Unsort() = DirectoryEntryName(Dir)
    If Not MatchRegularExpression(0, Unsort())
     DeleteElement(Unsort())
    EndIf
    If DirectoryEntryType(Dir) = #PB_DirectoryEntry_Directory
     Check(Dir$+"\"+DirectoryEntryName(Dir))
    EndIf
   EndIf
  Wend  
  CopyList(Unsort(), Sort())
  SortList(Unsort(), #PB_Sort_Ascending|#PB_Sort_NoCase)    
  ResetList(Sort())
  ForEach Unsort()
   NextElement(Sort())
   If Sort() <> Unsort()
    Unsortiert + 1
    Debug Dir$
    Break
   EndIf
  Next
 EndIf
 ProcedureReturn Str(Unsortiert)+" von "+Str(Summe)+" Verzeichnissen sind nicht sortiert!"
EndProcedure

Debug Check("D:")
0 von 4213 Verzeichnissen sind nicht sortiert!
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: ExamineDirectory sortiert Ergebnisse nicht

Beitrag von Nino »

Stargate, in Deinem Code fehlt etwas. :-)

Code: Alles auswählen

      FinishDirectory(Dir)   ; <=====
   EndIf
   ProcedureReturn Str(Unsortiert)+" von "+Str(Summe)+" Verzeichnissen sind nicht sortiert!"
EndProcedure
Ich gehe nicht davon aus, dass PureBasic selbst die Dateinamen sortiert, sondern dass es einfach die Informationen weitergibt, die es vom Betriebssystem geliefert bekommt. Die größte Rolle spielt wohl das Dateisystem auf dem jeweiligen Datenträger. Ohne diese beiden Anagben sind Aussagen zu "sortiert/unsortiert" unvollständig.
Meine Ergebnisse mit obigem Code (PB 4.51 auf Windows XP Pro x86):
Debug Check("C:\") ; NTFS: 0 von 8809 Verzeichnissen sind nicht sortiert!
Debug Check("D:\") ; FAT32: 219 von 6618 Verzeichnissen sind nicht sortiert!
Entscheidend ist, dass man sich nicht generell darauf verlassen kann, dass die Dateinamen sortiert sind. Soll ein Programm also eine sortierte Reihenfolge garantieren, muss es diese prüfen beziehungsweise selbst herstellen.

Grüße, Nino
Jet1199
Beiträge: 29
Registriert: 06.03.2005 00:33

Re: ExamineDirectory sortiert Ergebnisse nicht

Beitrag von Jet1199 »

Erstmal vielen Dank für all Eure konstruktiven Antworten.

Innerhalb meines Programmes verschiebe ich die Priorität der Sortierung zugunsten anderer, dringenderer Details. Aber ich werde es eilig nachholen und realisieren.

Besonderer Dank an STARGÅTE, der früh 6Uhr einen nachvollziebaren Schnipsel postete. Was habt Ihr für Jobs?!

Ich vermisse die Möglichkeit, einen Topic als "gelöst" zu kennzeichnen?!
Antworten