Seite 1 von 2

ExamineDirectory, aber wie mit unterordner? schnellhilfe

Verfasst: 06.05.2007 21:40
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

Verfasst: 06.05.2007 21:43
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

Verfasst: 06.05.2007 22:10
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 ^^

Verfasst: 06.05.2007 22:24
von ts-soft
>> Ich habe NOCH Lust ^^:
Aber vielleicht nicht schnell genug :mrgreen:
Wird er Dir bestimmt noch sagen :twisted:

Verfasst: 07.05.2007 18:44
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 

Verfasst: 07.05.2007 19:50
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!

Verfasst: 07.05.2007 20:25
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.

Verfasst: 07.05.2007 20:26
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.

Verfasst: 07.05.2007 21:00
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!

Verfasst: 07.05.2007 21:37
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? :?