Seite 1 von 1
Ordner zählen... klappt nicht ?!
Verfasst: 30.09.2006 19:10
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 ^^
Verfasst: 30.09.2006 19:45
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.
Verfasst: 30.09.2006 19:52
von a14xerus
die global variablen müssen VOR die procedure, udn bei mir (PB4.00) mussten noch ein paar befehle geändert werden
Verfasst: 30.09.2006 21:19
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"
Verfasst: 30.09.2006 21:56
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 ?
Verfasst: 30.09.2006 22:01
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.
Verfasst: 30.09.2006 22:18
von edel
okay , hab grad mal was zusammen geschustert (v4)
ich hoffe trotz einen stetig steigenden Alkohol-Pegels das es richtig ist

, wenn nicht , einfach ignorieren
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:\")
Verfasst: 01.10.2006 11:05
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.
Verfasst: 01.10.2006 19:18
von PeekS(Name)=Yves
Danke für die Tipps, nu klappts auch.
Verfasst: 01.10.2006 19:19
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]