Ein Verzeichnis in einer Baumansicht darstellen ?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Ein Verzeichnis in einer Baumansicht darstellen ?

Beitrag von Bisonte »

Hallo.

Ich habe da mal eine Gedankenblockade...

Ich möchte ein komplettes Laufwerk, das ich rekursiv in eine Liste eingelesen habe nun in einer
Baumansicht darstellen (in einem Textfile), ähnlich der eines TreeGadgets (komplett aufgeklappt).

Code: Alles auswählen

Listeneintrag von Files.s() : Musik:\Album\ACDC\Cover\KeinCover.jpg

So sollte es mal aussehen ....

Baumansicht :

Musik:\>
  +Album>
    +ACDC>
      +Cover>
        -KeinCover.jpg
      -Hells Bells.mp3
      -Thunderstruck.mp3
    +Heintje>
      -Mama.mp3                   
  -Albenliste.txt
  -Wiedergabeliste.mu3
Da ich grad wie das berühmte Schweinchen vor dem Uhrwerk sitze, brennt die Frage :

Wie fange ich das an ?

Ich bin über jeden Denkanstoß dankbar !
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​​
Benutzeravatar
TroaX
Beiträge: 684
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Linux Mint | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Linux Mint
Wohnort: NRW
Kontaktdaten:

Re: Ein Verzeichnis in einer Baumansicht darstellen ?

Beitrag von TroaX »

Am einfachsten geht es, wenn du den Textbaum direkt beim rekursizen einlesen der Dateiliste erstellst. So musst du jetzt den Pfad parsen, um überhaupt die Zugehörigkeiten der Dateien zu den einzelnen Ordnern aufzulösen. Da aber durch das bereits rekursive Einlesen der Liste die Reihenfolge stimmen müsste, würde ich (wenn ich die Dateien nicht selber einlesen könnte) da mit CountString und StringField beigehen. Wird nur eben lustig beim Erstellen der Schleifen. :D

Wenn ich aber auch die Dateiliste einlese, würde ich einfach jedes Element direkt beim Einlesen in den Textstring schreiben und dann hinterher in eine Textdatei speichern. So schlägst du gleich zwei Fliegen mit einer Klappe und kannst dir das parsen der Pfade sparen. ;)
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: Fritz.Box 5690 Pro (Nur für Keepass-DB)
Coding: Purebasic, Spiderbasic, GDevelop, Javascript/Node
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Ein Verzeichnis in einer Baumansicht darstellen ?

Beitrag von HeX0R »

meinst Du so?

Code: Alles auswählen

Structure _FILES_
	Name.s
	Type.s
	Depth.i
EndStructure

Global NewList Files._FILES_()

Procedure GetFiles(Dir.s, Pattern.s = "*.*", Depth.i = 1)
	Protected D
	
	D = ExamineDirectory(#PB_Any, Dir, Pattern)
	If D
		While NextDirectoryEntry(D)
			Select DirectoryEntryType(D)
				Case #PB_DirectoryEntry_Directory
					If DirectoryEntryName(D) <> "." And DirectoryEntryName(D) <> ".."
						AddElement(Files())
						Files()\Name  = DirectoryEntryName(D)
						Files()\Depth = Depth
						Files()\Type  = "+"
						GetFiles(Dir + DirectoryEntryName(D) + "/", Pattern, Depth + 1)
					EndIf
				Case #PB_DirectoryEntry_File
					AddElement(Files())
					Files()\Name  = DirectoryEntryName(D)
					Files()\Depth = Depth
					Files()\Type  = "-"
			EndSelect
		Wend
		FinishDirectory(D)
	EndIf
	
EndProcedure

Procedure main()
	Protected Dir.s, Add.s
	
	Dir = PathRequester("Select Path to scan", "")
	If Dir
		GetFiles(Dir)
		
		ForEach Files()
			Debug RSet(Files()\Type, Files()\Depth, #TAB$) + Files()\Name
		Next
	EndIf
EndProcedure

main()
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Ein Verzeichnis in einer Baumansicht darstellen ?

Beitrag von Bisonte »

Ja vielen Dank. Ich hab gerade das ganze ohne Struktur gemacht (Die Ebenen per Static Variable mitgezählt).
So ist natürlich "vornehmer" :allright:

Mein Problem war... Ich habe das Desktopverzeichnis meines Rechners zum testen genommen.
Dieses wird aber immer UNSORTIERT eingelesen.... (Äh Sortiert schon aber nur nach Alphabet und nicht auch Verz. vor Files)
Das kann einen an den Rand des Wahnsinns treiben :o
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​​
Antworten