Ordner zählen... klappt nicht ?!

Für allgemeine Fragen zur Programmierung mit PureBasic.
PeekS(Name)=Yves
Beiträge: 8
Registriert: 24.09.2006 11:10

Ordner zählen... klappt nicht ?!

Beitrag von PeekS(Name)=Yves »

Hallo ihr Forennutzer. Da wollte ich eben locker flockig das schreiben, was ich schon in vielen anderen Programmiersprachen mühelos daher geschrieben habe und ich muss mich schämern: Hier klappts nicht so, wie ichs will: Vor hatte ich, die Ordner + UnterOrdner + Deren UnterOrdner usw. sowie alle Dateien dieser Ordner zu zählen. so sieht mein Source aus. Leider Gottes zählt er mir... nix. Schwachsinnige ausgaben.

Code: Alles auswählen

Procedure ZaehleOuD(Ordner_name.s)
Ord = ExamineDirectory(#PB_Any, Ordner_name,"")
Repeat
Erg = NextDirectoryEntry()
Debug Erg
If Erg = 1
Dateien = Dateien +1
ElseIf Erg = 2
Ordner = Ordner+1
Name.s = DirectoryEntryName()
Debug Name
ZaehleOuD(Name.s)
EndIf

Until Erg = 0
EndProcedure

Global Ordner
Global Dateien

ZaehleOuD("C:\Windows")
Debug "Ordner " +Str(Ordner)
Debug "Dateien "+ Str(Dateien)
Wäre sehr geneigt, wenn jemand die Lösung parat hätte ^^
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Beitrag von uweb »

Ich habe mir den Code jetzt nicht angesehen, da Du ja nach einer Lösung gefragt hast.

http://www.purearea.net/pb/CodeArchiv/F ... le_Tree.pb kommt dem wohl sehr nahe.

Um so etwas auch komplett mit riesigen Platten machen zu können habe ich mir hier http://www.purebasic.fr/german/viewtopic.php?t=5281 mal Gedanken gemacht.
Zuletzt geändert von uweb am 30.09.2006 19:54, insgesamt 1-mal geändert.
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Beitrag von a14xerus »

die global variablen müssen VOR die procedure, udn bei mir (PB4.00) mussten noch ein paar befehle geändert werden
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

1. >> die global variablen müssen VOR die procedure
2. du mußt die pfadsymbole "." und ".." aussortieren.
3. du mußt beim rekursiven aufruf den pfadnamen zusätzlich zum namen des subdirs wieder mit einbeziehen.
4. wenn du von der rekursion zurückkommst, mußt du mit UseDirectory(..) den examine-status wiederherstellen.
[5. PB-version?]

Code: Alles auswählen

;PB 3.94

Global Ordner
Global Dateien

Procedure ZaehleOuD(Ordner_name.s)
	Protected Ord
	Protected Name.s
	Protected Erg
	Ord = ExamineDirectory(#PB_Any, Ordner_name,"")
	If Ord
		Repeat
			Erg = NextDirectoryEntry()
			If Erg = 1
				Dateien = Dateien +1
			ElseIf Erg = 2
				Name = DirectoryEntryName()
				If Name<>"." And Name<>".."
					Ordner = Ordner+1
					ZaehleOuD(Ordner_name+"\"+Name)
					UseDirectory(Ord)
				EndIf
			EndIf
		Until Erg = 0
	EndIf
EndProcedure

ZaehleOuD("C:\test03")
Debug "... "+Str(Ordner)+" order, "+Str(Dateien)+" dateien"

my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

#NULL hat geschrieben: [bla]
4. wenn du von der rekursion zurückkommst, mußt du mit UseDirectory(..) den examine-status wiederherstellen.
Wieso das ? Wenn ich zurueck zu der Procedure komme sind die Variablen doch noch gueltig ... aeh , oder ?
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

@edel
dacht ich auch, aber wenn du die UseDirectory()-zeile auskommentierst, wird's nichts.
vielleicht ist das aber in pb4 anderers ..aber da ist das glaub ich sowieso ein bißchen einfacher zu lösen. in pb3.94 gibt's ja kein FinishDirectory().

die variable Ord ist ja auch wieder die vorherige, aber durch ein erneutes examineDirectory() wurde sozusagen das 'CurrentExaminedDir' geändert, und das ist ja unabhängig vom proc-stack.
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

okay , hab grad mal was zusammen geschustert (v4)

ich hoffe trotz einen stetig steigenden Alkohol-Pegels das es richtig ist :oops: , wenn nicht , einfach ignorieren :freak:


Code: Alles auswählen

Procedure reDir(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 = ".." 
        reDir(Path+"\"+name) 
        Debug Path+"\"+name 
      ElseIf DirectoryEntryType(dir) = #PB_DirectoryEntry_File
        Debug name 
      EndIf
    Wend  
    
    FinishDirectory(dir)
  EndIf

EndProcedure

reDir("c:\")
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

edel hat geschrieben:
#NULL hat geschrieben: [bla]
4. wenn du von der rekursion zurückkommst, mußt du mit UseDirectory(..) den examine-status wiederherstellen.
Wieso das ? Wenn ich zurueck zu der Procedure komme sind die Variablen doch noch gueltig ... aeh , oder ?
Nein. In PB 3.94 gibt's doch kein FinishDirectory(). Das heißt, wenn man zurückkommt, dann wird der lette Ordner immernoch der aktive Ordner sein. Das Programm schmiert dann ab, weil man versucht, weitere Dateien und Ordner auszulesen, obwohl man schon alles erfragt hat.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
PeekS(Name)=Yves
Beiträge: 8
Registriert: 24.09.2006 11:10

Beitrag von PeekS(Name)=Yves »

Danke für die Tipps, nu klappts auch.
PeekS(Name)=Yves
Beiträge: 8
Registriert: 24.09.2006 11:10

Beitrag von PeekS(Name)=Yves »

Vor allem, wusste ich gar nicht, dass mir die Pfadsymbole "." und ".." angezeigt werden, bzw. meine Ausgabe von "." und ".." doch Sinn machte.

Vielen Dank.

[PB Version 3.91]
Antworten