Seite 1 von 1

Ordner kopieren mit Progressbar

Verfasst: 14.08.2007 21:17
von heini
Hallo,

ich habe nach der Möglichkeit gesucht, einen Ordner mit Progressbar zu kopieren. Habe hier im Forum viele Postings diesbezüglich gelesen und die Codes ausprobiert. Aber ich habe keinen gefunden der wirklich funktionierte. Also hab ich mir selbst was gebastelt.

Vielleicht kanns ja noch jemand gebrauchen....


Für diesen Code wird die PureFile Libary von Philippe 'gnozal' Guntz benötigt.
Diese findet Ihr hier:

http://people.freenet.de/gnozal/PureFILE_.zip

Code: Alles auswählen

;Window
Enumeration
  #Window_CopyProgress
EndEnumeration

;Gadgets
Enumeration
  #ProgressBar_0
  #TG_headline
  #TG_von
  #TG_vonV
  #TG_nach
  #TG_nachV
  #TG_progressV
EndEnumeration


Global fil.l                                    ;hochzählen Progressstatus
Global src.s = "g:\purebasic_libs\" ;PFAD ANPASSEN
Global dst.s = "d:\test\"                ;PFAD ANPASSEN
Global fAnz.l                                ;max. Wert der Progressbar

;#####################################
;Diese Prozedur ist 1:1 aus dem CodeArchiv übernommen.
;Sie dient zum ermitteln des Max. Wertes der Progressbar
;Danke an benny (Author) und HeXOR fürs Update auf 4.0
;#####################################
Procedure.l CountFiles(Dir.s)  
   Protected ID.l, files.l  
 
   If Right(Dir, 1) <> "\"  
      Dir + "\"  
   EndIf  
 
   ID = ExamineDirectory(#PB_Any, Dir, "")  
   If ID  
      While NextDirectoryEntry(ID)  
         Select DirectoryEntryType(ID)  
            Case 0  
               Break  
            Case #PB_DirectoryEntry_File  
               files + 1  
            Case #PB_DirectoryEntry_Directory  
               If DirectoryEntryName(ID) <> "." And DirectoryEntryName(ID) <> ".."  
                  files + CountFiles(Dir + DirectoryEntryName(ID))  
               EndIf  
         EndSelect  
      Wend  
   EndIf  
 
   ProcedureReturn files  
EndProcedure

;#######################################
;Diese Prozedur habe ich hier aus dem Forum
;http://www.purebasic.fr/german/viewtopic.php?t=11150&start=0&postdays=0&postorder=asc&highlight=pbescanpath
;Danke an Didelphodon (Author) und AND51 fürs optimieren
;#######################################
Procedure PBE_ScanPath(Path.s, *callbackProc) ; Scan the given path recursively and call callback (format dirId.l, path.s) (optimized by AND51)
  Protected dir.l, name.s, files.l;, fil.l
 
  If *callbackProc = 0 : ProcedureReturn #False : EndIf
 
  If Right(Path, 1) <> "\" : Path + "\" : EndIf
 
  dir = ExamineDirectory(#PB_Any, Path, "")

  If dir

    While NextDirectoryEntry(dir)
      name = DirectoryEntryName(dir)
      If name <> "." And name <> ".."
        If DirectoryEntryType(dir) = #PB_DirectoryEntry_Directory
          files + PBE_ScanPath(Path + name + "\", *callbackProc)
        Else
          files + 1
          CallFunctionFast(*callbackProc, Path + name)
        EndIf
      EndIf
    Wend
    FinishDirectory(dir)
    ProcedureReturn files
  EndIf
 
  ProcedureReturn #False
EndProcedure

Procedure FileCallback(File.s)
  
  fPath.s = GetPathPart(File)  ;Pfad der Datei ermitteln
  fLen.l = Len(File)                ;länge des Dateipfades ermitteln
  sLen.l = Len(src)                ;länge des Quellpfades ermitteln
  pLen.l = fLen - sLen            ;länge des Quellpfades von der länge des Dateipfades abziehen
  sub.s = Right(File, pLen)     ;Pfad ohne Quellpfad und Dateinmae ermitteln
 

If FileSize(File) = -2
  PureFILE_CreateDirectory(dst + sub)
Else 
  If FileSize(dst + sub) = -2
    CopyFile(File, dst + sub)
    SetGadgetText(#TG_vonV, File)
    SetGadgetText(#TG_nachV, dst + sub)
  Else  
    PureFILE_CreateDirectory(dst + sub) 
    CopyFile(File, dst + sub)
    SetGadgetText(#TG_vonV, File)
    SetGadgetText(#TG_nachV, dst + sub)
  EndIf
EndIf  
   
  fil = fil + 1 ;Progressstatus um 1 erhöhen
    
  SetGadgetState(#ProgressBar_0, fil)
  SetGadgetText(#TG_progressV, Str(fil) + " von " + Str(fAnz) + " Dateien kopiert")
EndProcedure

fAnz.l = CountFiles(src)   ;anzahl der Dateien im Quellverzeichnis ermitteln

If OpenWindow(#Window_CopyProgress, 475, 369, 482, 132, "Kopiervorgang...", #PB_Window_SizeGadget|#PB_Window_ScreenCentered)
    If CreateGadgetList(WindowID(#Window_CopyProgress))
      ProgressBarGadget(#ProgressBar_0, 5, 85, 475, 20, 0, fAnz, #PB_ProgressBar_Smooth)
      TextGadget(#TG_von, 5, 5, 45, 15, "Quelle:")
      TextGadget(#TG_vonV, 5, 20, 475, 15, "")
      TextGadget(#TG_nach, 5, 45, 45, 15, "Ziel:")
      TextGadget(#TG_nachV, 5, 60, 475, 15, "")
      TextGadget(#TG_progressV, 5, 110, 475, 15, "", #PB_Text_Center)
    EndIf
  EndIf
  
Debug PBE_ScanPath(src, @FileCallback())

erstellt mit: PB 4.02 (jaPBe v. 3.6.7.647)
getestet unter: WinXP Pro SP2
überprüft mit: DirComp v2.6 http://www.lab1.de/Central/Software/Dat ... s/Dircomp/

Gruss
Marco

Verfasst: 14.08.2007 21:21
von ts-soft
>> Für diesen Code wird die PureFile Libary von Philippe 'gnozal' Guntz benötigt.
Diese Lib existiert nur aus Kompatibilitätsgründen zu PB3.94, damit man alte
Sourcen nicht ändern braucht. Hat sonst unter PB4 keinerlei nutzen und ist in
Deinem Code nicht erforderlich.

Ansonsten schönen Danke fürs teilen (habs aber nicht getestet)

Verfasst: 14.08.2007 21:37
von heini
ts-soft hat geschrieben:>> Für diesen Code wird die PureFile Libary von Philippe 'gnozal' Guntz benötigt.
Diese Lib existiert nur aus Kompatibilitätsgründen zu PB3.94, damit man alte
Sourcen nicht ändern braucht. Hat sonst unter PB4 keinerlei nutzen und ist in
Deinem Code nicht erforderlich.
hmmmm.... nur mit CreateDirectory(Directory) hats nicht funktioniert.
wenn ich die Lib nicht benötige, mit welchem Befehl funktioniert es dann ?

Gruss
Marco

Verfasst: 14.08.2007 21:48
von ts-soft
heini hat geschrieben: hmmmm.... nur mit CreateDirectory(Directory) hats nicht funktioniert.
wenn ich die Lib nicht benötige, mit welchem Befehl funktioniert es dann ?

Gruss
Marco
Bei mir gehts mit CreateDirectory, ohne Probleme. Lediglich wenn der
Zielordner (der im source anzugebende) nicht existiert, dann kopiiert er
nichts, meldet aber den Erfolg. Solltest Du vielleicht nochmal überarbeiten.

Verfasst: 14.08.2007 21:59
von a14xerus
Alexander-N.de - Copy.dll hat geschrieben:AddFileToMove( // Fügt eine Datei zur Kopieren hinzu
char File
);

AddDirectoryToMove( //Fügt ein Komplettes Verzeichniss hinzu
char Directoy
);

Execute( //Kopiert oder Verschiebt alle hinzugefügten Dateien
char DestinationDirectory, // Zielverzeichnis (wird ggf. ertsellt)
int Mode, // 1 = copy, 2 = shift
int ShowProgress, // Zeige ein Fenster mit dem Fortschritt
int ShowWarnings, // Falls Fehler auftreten, können Warnugen angezeigt werden
int ParentID // Falls der Fortschritt angezeigt wird, kann man ein "ParentWindow" angeben
);
Source, Dll und test-EXE kannm man hier downloaden.
Thread