ExamineDirectory, aber wie mit unterordner? schnellhilfe

Anfängerfragen zum Programmieren mit PureBasic.
ChrisBa
Beiträge: 50
Registriert: 22.07.2006 12:14

ExamineDirectory, aber wie mit unterordner? schnellhilfe

Beitrag von ChrisBa »

Hallo
ich hab den Code von der Hilfer benutzt

Code: Alles auswählen

Directory$ = "C:\"   ; Listet alle Einträge auf C:\ auf (ohne die Inhalte aus Unterverzeichnissen)
  If ExamineDirectory(0, Directory$, "*.*")  
    While NextDirectoryEntry(0)
      If DirectoryEntryType(0) = #PB_DirectoryEntry_File
        Type$ = " [File] "
      Else
        Type$ = " [Sub-Dir] "
      EndIf
      
      Debug DirectoryEntryName(0) + Type$ + "- Größe in Bytes: " + Str(DirectoryEntrySize(0))
    Wend
    FinishDirectory(0)
  EndIf
nur leider werden die dateien in den unterordnern nicht angezeigt.
kann mir jemand sagen wie ich es mache,das im debug menü auch die dateien in den unterordnern angezeigt werden?
brauche schnelle antwort ^^
schonmal danke
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

>> brauche schnelle antwort ^^
Dann hätte ich an Deiner Stelle die Boardsuche genutzt!

Rekursiv gebe ich noch als Stichwort, ansonsten hab ich keine schnelle Lust mehr
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

Ich habe NOCH Lust ^^:

Ist ein Fenstern in dem du alle Dateien+Unterordner mit Dateien angezeigt bekommst:
Die Procedure steht oben dabei

Code: Alles auswählen

Procedure MeinWindowEvent()
 Event = WindowEvent()
 Select Event
  Case #PB_EventCloseWindow
   End
 EndSelect
EndProcedure

Global Nr, DateiEnde$, T
Procedure Ordner(Ordner$)
 alteNr = Nr
 ExamineDirectory(Nr, Ordner$, DateiEnde$)
 Repeat
  Art = NextDirectoryEntry()
  FileName$ = DirectoryEntryName() 
  If FileName$ <> "." And FileName$ <> ".."
   If Art = 1 :
    AddGadgetItem(1, -1, Ordner$+FileName$)
    MeinWindowEvent()
   ElseIf Art = 2
    AddGadgetItem(1, -1, "["+Ordner$+FileName$+"]")
    Nr + 1
    Ordner(Ordner$+FileName$+"\")
    UseDirectory(alteNr)
   EndIf
  EndIf
 Until Art = 0
EndProcedure 
    
 
OpenWindow(1, 300, 0, 600, 400, #PB_Window_SystemMenu, "File")
 CreateGadgetList(UseWindow(1))
  ListViewGadget(1, 0, 20, 600, 360)
  StringGadget(2, 0, 0, 350, 20, "C:\")
  StringGadget(5, 350, 0, 50, 20, "*.*")
  ButtonGadget(3, 400, 0, 100, 20, "Durchsuchen")
  ButtonGadget(4, 500, 0, 100, 20, "Dateien auflisten") 
Repeat
 Event = WaitWindowEvent()
 Select Event
  Case #PB_EventCloseWindow
   End
  Case #PB_EventGadget
   Select EventGadgetID()
    Case 3
     FileName$ = PathRequester("Ordner", "C:\")
     SetGadgetText(2, FileName$)
    Case 4
     DateiEnde$ = GetGadgetText(5)
     ClearGadgetItemList(1)
     AddGadgetItem(1, -1, "[]START[]")
     AddGadgetItem(1, -1, "["+GetGadgetText(2)+"]")
     Ordner(GetGadgetText(2))
     AddGadgetItem(1, -1, "[]ENDE[]")
   EndSelect
  Case #PB_EventMenu
   Select EventMenuID()
    Case 0
   EndSelect
 EndSelect
ForEver
PS: Lasse dir nicht C:\ auflisten ^^ denn das ist viel zu viel ^^
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
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

>> Ich habe NOCH Lust ^^:
Aber vielleicht nicht schnell genug :mrgreen:
Wird er Dir bestimmt noch sagen :twisted:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag von Thorsten1867 »

Noch etwas langsamer das Ergebnis eines Threads im Forum:

Code: Alles auswählen

Procedure.q GetDirectorySize(Path.s, rekursiv = #True)
  Protected dir.l, entry.s
  If Not Right(Path, 1) = "\"
    Path+"\"
  EndIf
  dir = ExamineDirectory(#PB_Any, Path, "")
  If dir
    While NextDirectoryEntry(dir)
      entry = DirectoryEntryName(dir)
      If entry = "." Or entry = ".."
        Continue
      ElseIf DirectoryEntryType(dir) = #PB_DirectoryEntry_File
        Size + DirectoryEntrySize(dir)
      ElseIf rekursiv
        Size + GetDirectorySize(Path+entry+"\", rekursiv)
      EndIf
    Wend
    FinishDirectory(dir)
  EndIf
  ProcedureReturn Size
EndProcedure 
Zuletzt geändert von Thorsten1867 am 07.05.2007 20:13, insgesamt 1-mal geändert.
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Hey Thorsten, deine Funktion arbeitet irgendwie falsch?

Ich habe auch eine gebastelt, die scheint geringfügig schneller zu arbeiten, als deine (ca. 30 ms):

Code: Alles auswählen

Procedure .q GetDirectorySize(path.s, recursive=#True)
	PathAddBackslash_(@path)
	Protected dir.l=ExamineDirectory(#PB_Any, path, ""), size.q
	If dir
		While NextDirectoryEntry(dir)
			If DirectoryEntryType(dir) = #PB_DirectoryEntry_File
				size+DirectoryEntrySize(dir)
				Continue
			ElseIf recursive And DirectoryEntryName(dir) <> "." And DirectoryEntryName(dir) <> ".."
				size+GetDirectorySize(path+DirectoryEntryName(dir)+"\", 1)
			EndIf
		Wend
		FinishDirectory(dir)
		ProcedureReturn size
	EndIf
EndProcedure

Debug GetDirectorySize("C:\")
Nun zu deinem Fehler: Mein Laufwerk C: ist mit 30,0 GB belegt, deine Procedure gibt jedoch 1,0 GB zurück? Meine hingegen, gibt 'korrekte' 0.03 TB zurück (ich habe das mit dem byterechner() umgerechnet).

Nochwas: Du speerst auch alle Dateien aus, die "." oder ".." heißen, ist das denn so gewollt? Bei Verzeichnissen verstehe ich das ja, aber Dateien? Und warum, übergibst du der Procedure beim rekursiven AUfurf die Variable "Rekursiv"? DIe muss dann ja erst wieder ausgelesen werden; machs doch so wie ich und gib direkt 1 an die Prozedur, denn ob Rekursivität gewünscht ist, prüfst du ja eh vorher.
Außerdem würde ich an deiner Stelle nicht oder nur mit einer umgestellten If-Abfrage den DirectoryEntryName() zwischenspeichern, weil es doch auf jeder Festplatte eh mehr Dateien als Verzeichnisse gibt, sodass sich dieser vermeintliche Geschwindigkeitsvorteil nicht auszahlt, auch wnen es eine hübsche Idee ist!
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
al90
Beiträge: 1101
Registriert: 06.01.2005 23:15
Kontaktdaten:

Beitrag von al90 »

AND51 hat geschrieben:Nochwas: Du speerst auch alle Dateien aus, die "." oder ".." heißen, ist das denn so gewollt? Bei Verzeichnissen verstehe ich das ja, aber Dateien?
"." & ".." gibts nur als Dirs. Würde sich auch nicht als File speichern lassen. (FileSystem Lock)
Aber insofern hast Du schon recht. Ich würde die abfrage auch eher
nur bei #PB_DirectoryEntry_Directory setzen.
Benutzeravatar
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag von Thorsten1867 »

Bei normalen Ordnergrößen ( < 1GB :wink:) bekomme ich mit beiden Prozeduren das gleiche Ergebnis. Zum Testen werde ich wohl meine Festplatte noch etwas auffüllen müssen. :mrgreen:

Deine Lösung gefällt mir sehr gut, ich werde sie wohl in EasySetup übernehmen.
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

> Deine Lösung gefällt mir sehr gut, ich werde sie wohl in EasySetup übernehmen.
Vielen Dank!
Gibt nicht viele, die Continue in dieser Prozedur benutzen (außer dir und mir... :lol: ) finds gut, ass du das gemacht hast!

> "." & ".." gibts nur als Dirs
Achso... Habs gerade getestet, eine Datei lässt sich nicht in "." umbennen; ok!
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Ligatur
Beiträge: 196
Registriert: 09.07.2006 00:41

Beitrag von Ligatur »

AND51 hat geschrieben:> Deine Lösung gefällt mir sehr gut, ich werde sie wohl in EasySetup übernehmen.
Vielen Dank!
Gibt nicht viele, die Continue in dieser Prozedur benutzen (außer dir und mir... :lol: ) finds gut, ass du das gemacht hast!

> "." & ".." gibts nur als Dirs
Achso... Habs gerade getestet, eine Datei lässt sich nicht in "." umbennen; ok!
Dann musst du mir nur noch erklären was das Continue an dieser Stelle bringt da doch überhaupt kein Code zum überspringen mehr vorhanden ist? :?
Antworten