Elegantes einlesen eines Verzeichnises mit Structure ?

Anfängerfragen zum Programmieren mit PureBasic.
anubclaw
Beiträge: 1
Registriert: 13.03.2011 19:46

Elegantes einlesen eines Verzeichnises mit Structure ?

Beitrag von anubclaw »

Hallo liebe Community,
ich habe heute folgendes Probiert und es funktioniert einfach nicht obwohl es theoretisch funktionieren sollte alles hatte mit arrays funktioniert aber bei Structures hakt es bei mir immer aus.
Was möchte ich erreichen ?
Einlesen eines Verzeichnisses und ablegen der Filenamen in eine Structure:

Meine Bitte: Kann da mal jemand drübergucken ich habe heute schon 3 x alles umgestellt aber ich bekomme immer noch die Fehlermeldung in Zeile 16: "Garbage at end of the line"

Code: Alles auswählen

Dim dir$(1)
folder$="d:\storage\fdm download"
SetCurrentDirectory(folder$)
Structure dirlist
  filename.s
  files.s
  filetype.s
 EndStructure
NewList dirl.dirlist()
ClearList(dirl.dirlist())  
If ExamineDirectory(0, folder$, "*.mp4")  
      While NextDirectoryEntry(0)
      If DirectoryEntryType(0) = #PB_DirectoryEntry_File
        dirl.dirlist\filetype()= "[File]"
      Else
        dirl.dirlist\filetype() = "[Sub-Dir]"
      EndIf
      dirs\files()=Str(DirectoryEntrySize(0)
      If AddElement(dirl.dirlist\filename())<>0
        dirl.dirlist\filename()=DirectoryEntryName(0) 
      EndIf
    Wend
      ForEach dirl.dirlist()
        Debug dirl.dirlist\filename()
        Debug dirl.dirlst\files()
        Debug dirl.dirlist\filetype()
      Next
      
       
    FinishDirectory(0)
  EndIf

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: Elegantes einlesen eines Verzeichnises mit Structure ?

Beitrag von NicTheQuick »

Du hast die Klammern an die falsche Stelle gesetzt und noch andere Sachen falsch gemacht.
So geht's richtig:

Code: Alles auswählen

;Was macht das hier?
;Dim dir$(1)

folder$ = "d:\storage\fdm download/"

SetCurrentDirectory(folder$)

Enumeration ;FileTypes
	#File
	#Directory
EndEnumeration

Structure DirList
	fileName.s
	fileSize.q
	fileType.i
EndStructure

NewList dirl.DirList()

;Das ist unnötig
;ClearList(dirl()) 

If ExamineDirectory(0, folder$, "*.mp4")
	
	While NextDirectoryEntry(0)
		
		;Neues Element in dirl() anlegen und füllen
		If (AddElement(dirl()))
			If DirectoryEntryType(0) = #PB_DirectoryEntry_File
				dirl()\fileType = #File
				dirl()\fileSize = DirectoryEntrySize(0)
			Else
				dirl()\fileType = #Directory
			EndIf
			
			dirl()\fileName = DirectoryEntryName(0)
		EndIf
	Wend
	
	FinishDirectory(0)
	
	ForEach dirl()
		If dirl()\fileType = #Directory
			Debug "[DIR]"
			Debug dirl()\fileName
		Else
			Debug "[FILE]"
			Debug dirl()\fileName
			Debug dirl()\fileSize
		EndIf
	Next
	
EndIf
Benutzeravatar
jear
Beiträge: 288
Registriert: 17.10.2004 01:59
Wohnort: Ammerland

Re: Elegantes einlesen eines Verzeichnises mit Structure ?

Beitrag von jear »

Noch ein Vorschlag

Code: Alles auswählen

folder.s = "d:\storage\fdm download/"
ext.s = "*.mp4"

Structure dirlist
  filename.s
  size.q
EndStructure
NewList dirl.dirlist()

With dirl() 
  
  If ExamineDirectory(0, folder, ext)  
    While NextDirectoryEntry(0)
      If DirectoryEntryType(0) = #PB_DirectoryEntry_File
        AddElement(dirl())
        \filename = DirectoryEntryName(0)
        \size = DirectoryEntrySize(0) / 1024 ; NtQ : natürlich ist eine Float hier Unsinn!
      EndIf 
    Wend 
    FinishDirectory(0)
  Else
    Debug "Verzeichnis nicht vorhanden: " + folder 
    End
  EndIf
  
  Debug "Inhalt von Verzeichnis: " + folder
  ForEach dirl()
    Debug \filename + " - " + Strq(\size) + " KBytes"
  Next
  
EndWith

End
So wird ein einziges Verzeichnis aufgelistet. enn Du alles unterhalb des Verzeichnisses auflisten willst, musst Du das Ganze in eine sich selbst rekursiv aufrufende Prozedur packen.
Zuletzt geändert von jear am 15.03.2011 20:00, insgesamt 2-mal geändert.
Man ist nie zu alt zum lernen, auch wenn man dabei manchmal alt aussieht!
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: Elegantes einlesen eines Verzeichnises mit Structure ?

Beitrag von NicTheQuick »

@jear:
Das mit dem Float ist aber nicht dein Ernst, oder? Und warum nutzt du 'FileSize()', wenn es 'DirectoryEntrySize()' gibt?
Antworten