Seite 1 von 1

Alle Dateinamen eines Ordners kombinieren

Verfasst: 05.05.2010 00:38
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

Re: Alle Dateinamen eines Ordners kombinieren

Verfasst: 05.05.2010 00:59
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 ?

Re: Alle Dateinamen eines Ordners kombinieren

Verfasst: 05.05.2010 01:05
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).

Re: Alle Dateinamen eines Ordners kombinieren

Verfasst: 05.05.2010 01:13
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

Re: Alle Dateinamen eines Ordners kombinieren

Verfasst: 05.05.2010 01:29
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?

Re: Alle Dateinamen eines Ordners kombinieren

Verfasst: 05.05.2010 02:02
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.

Re: Alle Dateinamen eines Ordners kombinieren

Verfasst: 13.07.2014 03:08
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

Re: Alle Dateinamen eines Ordners kombinieren

Verfasst: 13.07.2014 13:19
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.