Alle Ordner zählen [X]

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Alle Ordner zählen [X]

Beitrag von RSBasic »

Hallo,
ich möchte gerne ermitteln, wieviele Ordner auf der Festplatte vorhanden sind.
Dabei gehe ich in Unterverzeichnisse und zähle sie einzeln.

Code: Alles auswählen

Global Ordneranzahl=0

Procedure Ordnerzaehlen(Path.s) 
  dir = ExamineDirectory(#PB_Any,Path,"*.*") 
  If dir 
    While NextDirectoryEntry(dir) 
      name.s = DirectoryEntryName(dir) 
      If DirectoryEntryType(dir) = #PB_DirectoryEntry_Directory And Not name = "." And Not name = ".." 
        Ordnerzaehlen(Path+"\"+name) 
        Ordneranzahl+1
        Debug Ordneranzahl 
      EndIf
    Wend  
    FinishDirectory(dir) 
  EndIf
EndProcedure 

Ordnerzaehlen("c:\")
Gibt es keine andere, schnellere, bessere Lösung?
Zuletzt geändert von RSBasic am 12.12.2007 08:11, insgesamt 1-mal geändert.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Beitrag von milan1612 »

Kurze Antwort: Nein :wink:
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Benutzeravatar
Franky
Beiträge: 1132
Registriert: 29.08.2004 16:31
Wohnort: Münsterland
Kontaktdaten:

Beitrag von Franky »

Naja, man kann es zumindest optimieren

Code: Alles auswählen


Global Ordneranzahl=0

Procedure Ordnerzaehlen(Path.s)
  dir = ExamineDirectory(#PB_Any,Path,"*.*")
  If dir
    NextDirectoryEntry(dir)
    NextDirectoryEntry(dir)
    While NextDirectoryEntry(dir)
      name.s = DirectoryEntryName(dir)
      If DirectoryEntryType(dir) = #PB_DirectoryEntry_Directory
        Ordnerzaehlen(Path+"\"+name)
        Ordneranzahl+1
        Debug Ordneranzahl
      EndIf
    Wend 
    FinishDirectory(dir)
  EndIf
EndProcedure

Ordnerzaehlen("c:\") 
"." und ".." sitzen soweit ich das weiß ja immer am Anfang ;)
Falsch zugeordnetes Zitat des Tages: "O'zapft is" - Edward Snowden :)
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Naja, man kann es zumindest noch weiter optimieren:

Code: Alles auswählen

Procedure Ordnerzaehlen(Path.s) 
  Protected Ordner
  dir = ExamineDirectory(#PB_Any,Path,"") 
  If dir 
    NextDirectoryEntry(dir) 
    NextDirectoryEntry(dir) 
    While NextDirectoryEntry(dir) 
      If DirectoryEntryType(dir) = #PB_DirectoryEntry_Directory 
        Ordner+Ordnerzaehlen(Path+"\"+DirectoryEntryName(dir))+1
        Continue
      EndIf 
    Wend 
    FinishDirectory(dir) 
  EndIf 
  ProcedureReturn Ordner
EndProcedure 

Debug Ordnerzaehlen("c:\") 
:wink:
Wieso den Namen jedes Elements zwischenspeichern, wo doch nur Namen von Ordnern gebraucht werden?
Wozu überhaupt zwischenspeichern, wenn man doch direkt einsetzen kann?

Code ist ungetestet, ich glaube man muss bei jedem rekursiven Aufruf manuell +1 rechnen, oder?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

das continue ist glaube ich unfug, da würde in jeder ordnertiefe nur ein ordner untersucht (einschließlich seines ersten unterordners usw..)
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Im gegenteil, allein in C: sind schon mehrere ordner drin (zumindest bei mir). Sagen wir mal, es sind 20 stück, dann spring er 20 Mal nach dem zurückkommen direkt nach oben, ohne erst die Schleife zuende zu laufen.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Da aber nach dem Continue eh nichts steht ist es völlig sinnlos...
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Das stimmt, aber ich hatte schon mal so einen Fall, auch beim rekursiven Ordner-Stöbern; IIRC dann hats was gebracht, bin mir aber nicht mhehr sicher... Und wenn schon: Mit einem ungewöhnlichen Continue sieht der Code doch gleich viel gekonnter/eleganter aus... :lol:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

ich hab Continue mit Break verwechselt, tschuldsche.
aber sinnlos ist es trotzdem.
my pb stuff..
Bild..jedenfalls war das mal so.
Antworten