Alle Dateinamen eines Ordners kombinieren

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

Alle Dateinamen eines Ordners kombinieren

Beitrag von Delle »

Hallo,

ich will das alle möglichen Kombinationen von Dateinamen von einem Ordner ausgegeben werden.

Code: Alles auswählen

If ExamineDirectory(1, "","*.txt") 
    
   Repeat 
    
      FileType1 = NextDirectoryEntry(1) 
    
         If FileType1


    If ExamineDirectory(0, "","*.txt") 
    
        Repeat 
    
           FileType0 = NextDirectoryEntry(0) 
    
           If FileType0
           Debug DirectoryEntryName(1)+" + "+DirectoryEntryName(0)
           EndIf 
    
        Until FileType0 = 0 
    
    EndIf 




      EndIf 
    
   Until FileType1 = 0 
    
EndIf 


Das läuft leider endlos, ich weiß nur nicht warum.

Wenn 4 .txt-Dateien im Ordner vorhanden sind, dann soll er dies so debuggen:

datei1.txt + datei1.txt (*1)
datei1.txt + datei2.txt
datei1.txt + datei3.txt
datei1.txt + datei4.txt
datei2.txt + datei1.txt (*2)
datei2.txt + datei2.txt (*1)
datei2.txt + datei3.txt
datei2.txt + datei4.txt
datei3.txt + datei1.txt (*2)
datei3.txt + datei2.txt (*2)
datei3.txt + datei3.txt (*1)
datei3.txt + datei4.txt
datei4.txt + datei1.txt (*2)
datei4.txt + datei2.txt (*2)
datei4.txt + datei3.txt (*2)
datei4.txt + datei4.txt (*1)

(*1) = sollte eigentlich vorkommen, weil gleicher Dateiname
(*2) = diese Kombination ist schon mal weiter oben vorhanden

Gibt's dafür ev. eine einfachere Lösung ohne die "doppelten" Ergebnisse? Ein Array?

Danke,
Delle
PB 6.21 | Win 11
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Alle Dateinamen eines Ordners kombinieren

Beitrag von STARGÅTE »

naja es fehlt in der inneren Schleife (welche mehrmals ExamineDirectory aufruft) ein FinishDirectory()

Einfacher würde es sein, wenn du das Verseichnis nur einmal durchgehst.

Dann speicherst du das in einem Array oder LinkedList.
Und gehst diese dann mit einer Doppelschleife durch ...

BTW: Was hast du eigentlich vor ?
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
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

Re: Alle Dateinamen eines Ordners kombinieren

Beitrag von Delle »

STARGÅTE hat geschrieben:Dann speicherst du das in einem Array oder LinkedList.
Und gehst diese dann mit einer Doppelschleife durch ...
Ja tendiere auch zu LL... aber wie vermeide ich dann gleiche Kombis (datei1.txt + datei1.txt) und Kombis, die schon mal kamen?
STARGÅTE hat geschrieben:BTW: Was hast du eigentlich vor ?
Puh... ist eine Art Batch-Dateienvergleich/Konverter... gibt leider aber keine andere Lösung wie obige (also mit dem Kombinieren).
PB 6.21 | Win 11
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Alle Dateinamen eines Ordners kombinieren

Beitrag von STARGÅTE »

Einfach die zweite schleife immer erst nach dem aktuellen elemente starten lassen:

Hier ein einfaches Beispiel dazu:

Code: Alles auswählen

NewList Beispiel.Integer()

For n = 1 To 10
  AddElement(Beispiel()) : Beispiel()\i = n
Next

ForEach Beispiel()
  *Beispiel.Integer = @Beispiel()
  While NextElement(Beispiel())
    Debug Str(*Beispiel\i)+" <-> "+Str(Beispiel()\i)
  Wend
  ChangeCurrentElement(Beispiel(), *Beispiel)
Next
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
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

Re: Alle Dateinamen eines Ordners kombinieren

Beitrag von Delle »

Funktioniert super, lässt sich aber nicht auf String-LLs übertragen oder?

Code: Alles auswählen

NewList Beispiel.s()


  AddElement(Beispiel()) : Beispiel()\i = "test1"
  AddElement(Beispiel()) : Beispiel()\i = "test2"
  AddElement(Beispiel()) : Beispiel()\i = "test3"


ForEach Beispiel()
  *Beispiel.Integer = @Beispiel()
  While NextElement(Beispiel())
    Debug Str(*Beispiel\i)+" <-> "+Str(Beispiel()\i)
  Wend
  ChangeCurrentElement(Beispiel(), *Beispiel)
Next
Da meckert er wegen einer fehlenden Struktur rum... und für was steht das \i eigentlich?
PB 6.21 | Win 11
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Alle Dateinamen eines Ordners kombinieren

Beitrag von STARGÅTE »

ich habs mir angewöhnt, jeder LinkedList n Struktur zu geben, auch wenns nur eine Integer oder String ist.
Deswegen hier die Structure Integer mit dem Feld \i

wenn du das "nicht willst" dann nutze es so:

Code: Alles auswählen

NewList Beispiel.s()


For n = 1 To 10
  AddElement(Beispiel()) : Beispiel() = "test"+Str(n)
Next

ForEach Beispiel()
  *Beispiel.String = @Beispiel()
  While NextElement(Beispiel())
    Debug *Beispiel\s+" <-> "+Beispiel()
  Wend
  ChangeCurrentElement(Beispiel(), *Beispiel)
Next 
Wenn ich hier (wie du siehst) Pointer nutze, erspare ich mir Variablen die irgendwas zwischenspeichern würden.
Deswegen speicher ist nur das "äußere" Element in einem Pointer, und greife dnan dort auf den String zu und in der inneren Liste auf die Liste selber.
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
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

Re: Alle Dateinamen eines Ordners kombinieren

Beitrag von Delle »

So ich nochmal ;)

Kann es sein, dass der Code irgendwie mögliche Kombinationen "verschluckt"?

Bei 266 Dateien liefert er mir 35245 mögliche Kombinationen... stimmt das wenigstens rechnerisch?

Code: Alles auswählen

       NewList Beispiel.s()
        
        NewList Kombis.s()
        
        If ExamineDirectory(0, "","*.txt")
Repeat:FileType=NextDirectoryEntry(0):If FileType:AddElement(Beispiel()):Beispiel()=DirectoryEntryName(0):EndIf:Until FileType=0
EndIf

          ForEach Beispiel()
            
            *Beispiel.String = @Beispiel()

            While NextElement(Beispiel()):AddElement(Kombis()):Kombis()=*Beispiel\s+"|"+Beispiel():Wend
          
            ChangeCurrentElement(Beispiel(), *Beispiel)
  
          Next 
          
          ForEach Kombis()
            
            Debug StringField(Kombis(),1,"|")+" ... "+StringField(Kombis(),2,"|")
            
          Next
PB 6.21 | Win 11
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: Alle Dateinamen eines Ordners kombinieren

Beitrag von NicTheQuick »

Wieso? Stimmt doch genau. Bei n Dateien kriegst du (n · (n - 1)) / 2 Kombinationen.

Übrigens: Der Code sieht ganz schön hässlich aus.
Antworten