Seite 1 von 1

Alle Ordner zählen [X]

Verfasst: 10.12.2007 21:38
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?

Verfasst: 10.12.2007 21:44
von milan1612
Kurze Antwort: Nein :wink:

Verfasst: 11.12.2007 11:34
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 ;)

Verfasst: 11.12.2007 17:00
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?

Verfasst: 11.12.2007 17:02
von #NULL
das continue ist glaube ich unfug, da würde in jeder ordnertiefe nur ein ordner untersucht (einschließlich seines ersten unterordners usw..)

Verfasst: 11.12.2007 18:13
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.

Verfasst: 11.12.2007 18:16
von Deeem2031
Da aber nach dem Continue eh nichts steht ist es völlig sinnlos...

Verfasst: 11.12.2007 18:18
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:

Verfasst: 11.12.2007 19:35
von #NULL
ich hab Continue mit Break verwechselt, tschuldsche.
aber sinnlos ist es trotzdem.