Seite 1 von 1

Kopieren mit Unterordnern

Verfasst: 17.06.2014 01:57
von schleicher
Ich habe einen Fehler in der Procedure und kann den Fehler nicht finden. Vieleicht kann mir da mal jemand helfen.
Probleme sind im Code beschrieben. Code ist testbar.

Code: Alles auswählen

EnableExplicit


Global dirzaehler=0
Global diranzahl=0
Global pfad$, x , startdir$
Global Dim verzeichnis$(4000)

Global FontID1
FontID1 = LoadFont(1, "Arial", 14)

Declare putFTPdirs(pfad$)
Declare.s FormatByteSize(n.q)

startdir$ = "c:\test"  ; hier anpassen (Hat hier im Test 2 Unterordner)



OpenWindow(0,0,0,400,150,"Test",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
TextGadget(1, 50, 30, 300, 30, "Backup wird gestartet . . .", #PB_Text_Center)
SetGadgetFont(1, FontID1)
TextGadget(2, 50, 70, 300, 30, "Backup wird gestartet . . .", #PB_Text_Center)
SetGadgetFont(2, FontID1)



Procedure putFTPdirs(pfad$)
  Protected gesamtbyte
  Protected Ergebnis
  Protected verz1$
  Protected dirzaehler
  Protected diranzahl
  Protected Ereignis
  
  
  Debug pfad$
  ; Hier sollten der Ordner und Unterordner durchlaufen, aber funktioniert nur halb(Es fehlt der 2.Unterordner)
  SetCurrentDirectory(pfad$)
  
  ExamineDirectory(1, pfad$,"") 
  
  While  NextDirectoryEntry(1) 
    If DirectoryEntryType(1)=#PB_DirectoryEntry_Directory
      verz1$=DirectoryEntryName(1)
      If verz1$<>".." And verz1$<>"."
        diranzahl+1
        Ereignis = WindowEvent()
        SetGadgetText(1,"analyze directory :   "+Str(diranzahl))
        verzeichnis$(diranzahl)=pfad$+verz1$+"\"
      EndIf
    Else
      gesamtbyte=gesamtbyte+DirectoryEntrySize(1)
      SetGadgetText(2,"Total-Bytes :  "+FormatByteSize(gesamtbyte))  ; Da ein Unterordner fehlt, stimmt gesamtbyte natürlich nicht.
    EndIf
  Wend
  If dirzaehler<diranzahl
    dirzaehler+1
    putFTPdirs(verzeichnis$(dirzaehler))
  EndIf
  
  Debug "diranzahl nach Schleife ; "+ diranzahl
EndProcedure

Procedure.s FormatByteSize(n.q)
  Protected s.s=Str(n)
  Protected len=Len(s)
  Protected ret.s
  Protected i
  For i=0 To len-1
    If i And Not i%3 :: ret="."+ret :: EndIf
    ret= Mid(s,len-i,1) +ret
  Next
  ProcedureReturn ret
EndProcedure


verzeichnis$(diranzahl)=startdir$
putFTPdirs(startdir$+"\")


Debug "dirnumbers for copy = "+ diranzahl
;Hier sollte als dirnumbers 2 nicht 0 erscheinen , und ich habe nicht herausfinden können warum



For x=0 To diranzahl
  ; getFTPfiles(verzeichnis$(x)) ;;;;; diese Procedure übernimmt dann das erstellen der Ordner auf dem Server und das übertragen der Dateien.Habe jetz hier zum Test diese Procedure weggelassen.
Next

Repeat
  
  Select WaitWindowEvent(20)
    Case #PB_Event_CloseWindow
      Break        
  EndSelect   
ForEver  

Re: Kopieren mit Unterordnern

Verfasst: 17.06.2014 02:07
von STARGÅTE
Wieso definierst du viele Variablen als Global und Protected.
Das geht zwar, aber so verlierst du ja ggf. den Überblick.

So wird nämlich dein Array (welches Global ist!) vom 1. Aufruf (mit den beiden Unterordnern) gefüllt, aber beim durchsuchen des 1. Unterordners wieder überschrieben. Deswegen kommt es vermutlich zum fehler wenn die Procedure den 2. Unterordner ansprechen will.
Debug "dirnumbers for copy = "+ diranzahl
;Hier sollte als dirnumbers 2 nicht 0 erscheinen , und ich habe nicht herausfinden können warum
Nö, denn deine globale Variable diranzahl wird nicht erhöht, sondern nur deine protected diranzahl!

Re: Kopieren mit Unterordnern

Verfasst: 17.06.2014 12:40
von schleicher
STARGÅTE hat geschrieben:Wieso definierst du viele Variablen als Global und Protected.
Das geht zwar, aber so verlierst du ja ggf. den Überblick.
Danke für die Antwort.Hast recht. Es ist mein erstes Projekt und muss noch einiges lernen. Wie müsste man eine Variable definieren, sodas wie in meinem Code die Variable -Diranzahl- nur für diese Procedure funktioniert , aber auch an einen Befehl außerhalb der Procedure übergeben wird ? Das mit der Variable -Diranzahl- war ein guter Tip.Schaue ich mir gleich genauer an.


So habs kontrolliert. Das war der Fehler, das ich die Variablen dirzähler und diranzahl doppelt definiert habe.
Nun funktionierts tadellos.

Re: Kopieren mit Unterordnern

Verfasst: 17.06.2014 15:17
von STARGÅTE
schleicher hat geschrieben:Wie müsste man eine Variable definieren, sodas wie in meinem Code die Variable -Diranzahl- nur für diese Procedure funktioniert , aber auch an einen Befehl außerhalb der Procedure übergeben wird ?
Du kannst mit ProcedureReturn einen Wert (Zahl oder String) aus der Prozedur zurückgeben.

Im Übrigen musst du die Verzeichnisse nicht in einem Array zwischenspeichern, um sich danach ebenfalls zu untersuchen.
Du kannst deine Prozedur auch direkt an der Stelle wo das Verzeichnis gefunden wird aufrufen.
Dafür musst du jedoch ExamineDirectory() mit #PB_Any aufrufen, da sonst ebenfalls Informationen verloren gehen, und dann mit FinishDirectory() beenden.

Hier mal ein Beispiel dafür und für ProcedureReturn:

Code: Alles auswählen

Procedure.i DirectorySize(Path.s)
	
	Protected Directory.i
	Protected Size.i ; Size ist lokal und wird später zurückgegeben
	
	If Right(Path, 1) <> "\" : Path + "\" : EndIf ; Pfad muss immer mit "\" enden
	Directory = ExamineDirectory(#PB_Any, Path, "*")
	If Directory
		While NextDirectoryEntry(Directory)
			Select DirectoryEntryType(Directory)
				Case #PB_DirectoryEntry_File
					Size + DirectoryEntrySize(Directory) ; Dateigröße hinzu addieren
				Case #PB_DirectoryEntry_Directory
					If DirectoryEntryName(Directory) <> "." And DirectoryEntryName(Directory) <> ".."
						Size + DirectorySize(Path+DirectoryEntryName(Directory)) ; Größe des Unterordners hinzu addieren
					EndIf
			EndSelect
		Wend
		FinishDirectory(Directory)
	EndIf
	
	ProcedureReturn Size
	
EndProcedure

Debug #PB_Compiler_Home+" ("+StrF(DirectorySize(#PB_Compiler_Home)/1024/1024,2)+" MB)"

Re: Kopieren mit Unterordnern

Verfasst: 17.06.2014 15:32
von schleicher
Super Erklärung. Wieder was dazu gelernt. Danke :allright: