Seite 1 von 2

Status beim kopieren anzeigen!

Verfasst: 17.10.2005 12:08
von newcoder
Hi Leute

Ich möchte in meinem PB Programm ein Daten von einem
Ordner zum anderen kopieren. Das mache ich mit CopyDirectory
und das klappt auch wunderbar! Nur möchte ich jetzt noch einen
Fortschritsbalken oder eine Statusanzeige miteinbauen, damit
man sieht was passiert und weis das, das Progy noch kopiert!

Kann mir jemand sagen wie ich das am einfachsten anstelle ?

Gruß Jon

Verfasst: 17.10.2005 12:16
von hardfalcon
Am einfachsten geht es IMHO, wenn du einen Thread erstellst, der die Größe des Zielverzeichnisses ständig mit der Größe des Ausgangsverzeichnisses vergleicht, und das Ganze, eventuell als Prozent- oder Promille-Angabe an ein StatusBarGadget() weiterreicht.

//EDIT: Willkommen im Forum übrigens! :D

Verfasst: 17.10.2005 12:32
von newcoder
Kannst du dazu vielleicht einen kleinen quellcode posten?

Verfasst: 17.10.2005 12:32
von ts-soft
Per API:

Code: Alles auswählen

Procedure ForceDirectories(Directory.s)
  If Len(Directory) > 0
    If (Right(Directory, 1) = "\")
      Directory = Left(Directory, Len(Directory) -1)
    EndIf
    If (Len(Directory) < 3) Or FileSize(Directory) = -2 Or GetPathPart(Directory) = Directory
      ProcedureReturn #False
    EndIf
    ForceDirectories(GetPathPart(Directory))
    CreateDirectory(Directory)
    ProcedureReturn #True
  EndIf
EndProcedure

Procedure TS_CopyFile(SourceFile.s, DestinationPath.s, Flag.l)
  flags.l = #FOF_MULTIDESTFILES
  If FileSize(SourceFile) = -2
    If Right(SourceFile, 1) <> "\" : SourceFile + "\" : EndIf
    SourceFile + "*.*"
    ForceDirectories(DestinationPath)
  Else
    If GetExtensionPart(SourceFile) = ""
      ForceDirectories(DestinationPath)
      If FileSize(DestinationPath) = -2 : DestinationPath + GetFilePart(SourceFile) : EndIf
    Else
      flags = flags | #FOF_FILESONLY
    EndIf
  EndIf
  If Flag
    flags = flags | #FOF_NOCONFIRMATION
    ForceDirectories(DestinationPath)
  EndIf
  SHFileOp.SHFILEOPSTRUCT
  SHFileOp\hwnd   = WindowID()
  SHFileOp\wFunc  = #FO_COPY
  SHFileOp\pFrom  = @SourceFile
  SHFileOp\pTo    = @DestinationPath
  SHFileOp\fFlags = flags
  Result.l        = SHFileOperation_(SHFileOp)
  If Result <> 0
    ProcedureReturn 0
  Else
    ProcedureReturn 1
  EndIf
EndProcedure
TS_CopyFile("E:\TS-Temp\Download\*.zip", "E:\Hallo\", 0)
Kopiert den SourceFile.s nach DestinationPath.s. Für SourceFile.s sind Jokerzeichen (z. B. *.htm) erlaubt. Wird als Jokerzeichen *.* angegeben, werden alle Dateien, aber keine Verzeichnisse kopiert. Wird bei SourceFile.s hingegen ein Ordner angegeben, so wird dessen Inhalt mit allen Unterverzeichnissen kopiert.
Wenn der optionale Parameter Flag.l nicht gesetzt ist, wird vor dem überschreiben von Dateien nachgefragt.
Result gleich 0, konnte/n die Datei/en nicht kopiert werden.
Ist leider nicht immer fehlerfrei, keine Lust mehr gehabt :oops:

Verfasst: 17.10.2005 12:33
von PAMKKKKK
Unter Windows : In der windows API gibt es ein befehl der heisst: CopyProgressRoutine.
Der macht das.
Schau mal hier:
http://forums.purebasic.com/german/view ... essroutine

Ob das allerdings auch bei CopyDirectory geht, weiss ich nicht.

Sonst musst du alle Dateien und Unterverzeichnisse einzel Kopieren lassen.

Verfasst: 17.10.2005 12:40
von ts-soft
PAMKKKKK hat geschrieben:Unter Windows : In der windows API gibt es ein befehl der heisst: CopyProgressRoutine.
Der verwendete API Befehl heisst aber "CopyFileEx_", nur als Hinweis

Verfasst: 17.10.2005 13:35
von gnozal

Code: Alles auswählen

Procedure ForceDirectories(Directory.s) 
  If Len(Directory) > 0 
    If (Right(Directory, 1) = "\") 
      Directory = Left(Directory, Len(Directory) -1) 
    EndIf 
    If (Len(Directory) < 3) Or FileSize(Directory) = -2 Or GetPathPart(Directory) = Directory 
      ProcedureReturn #False 
    EndIf 
    ForceDirectories(GetPathPart(Directory)) 
    CreateDirectory(Directory) 
    ProcedureReturn #True 
  EndIf 
EndProcedure
Mit Windows geht es auch so :

Code: Alles auswählen

MakeSureDirectoryPathExists_(Directory.s)

Verfasst: 17.10.2005 13:41
von ts-soft
gnozal hat geschrieben: Mit Windows geht es auch so :

Code: Alles auswählen

MakeSureDirectoryPathExists_(Directory.s)
Ja, aber erst ab Windows 2000 :wink: , deshalb verwende ich das nicht
MSDN hat geschrieben:Requirements
Client Requires Windows XP or Windows 2000 Professional.
Server Requires Windows Server 2003 or Windows 2000 Server.
Redistributable Requires DbgHelp.dll on Windows NT 4.0 and Windows Me/98/95.
Header Declared in Dbghelp.h.

Library Link to Dbghelp.lib.

DLL Requires Dbghelp.dll.

Verfasst: 17.10.2005 15:25
von gnozal
ts-soft hat geschrieben:
gnozal hat geschrieben: Mit Windows geht es auch so :

Code: Alles auswählen

MakeSureDirectoryPathExists_(Directory.s)
Ja, aber erst ab Windows 2000 :wink: , deshalb verwende ich das nicht
Ich hab Win98 und es funktioniert prima :shock:

MakeSureDirectoryPathExists() ist in IMAGEHLP.DLL (PB Windows lib : PureLibraries\Windows\IMAGEHLP)
Aus Win32.hlp :
The IMAGEHLP function set is an API for the Windows NT and Windows 95 operating systems.

Verfasst: 17.10.2005 15:42
von ts-soft
>> Ich hab Win98 und es funktioniert prima :shock:
Glaube ich Dir gerne, hab aber festgestellt, das es nicht immer funzt, weiß aber nicht mehr wovon es abhängt. Kann sein, das es WinME wahr?
Vorsicht ist die Mutter der Porzellankiste :wink: