Status beim kopieren anzeigen!

Anfängerfragen zum Programmieren mit PureBasic.
newcoder
Beiträge: 2
Registriert: 17.10.2005 12:05

Status beim kopieren anzeigen!

Beitrag 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
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag 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
newcoder
Beiträge: 2
Registriert: 17.10.2005 12:05

Beitrag von newcoder »

Kannst du dazu vielleicht einen kleinen quellcode posten?
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
PAMKKKKK
Beiträge: 321
Registriert: 21.04.2005 22:08
Wohnort: Braunschweig
Kontaktdaten:

Beitrag 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.
Wir Schreiben ein PureBasic Buch.
Auch du kannst mitmachen!
http://www.purearea.net/pb/english/pure ... :Main_Page
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
gnozal
Beiträge: 219
Registriert: 04.12.2004 13:01
Wohnort: Frankreich (67)
Kontaktdaten:

Beitrag 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)
For free libraries and tools, visit my web site (also home of jaPBe V3 and PureFORM).
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
gnozal
Beiträge: 219
Registriert: 04.12.2004 13:01
Wohnort: Frankreich (67)
Kontaktdaten:

Beitrag 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.
For free libraries and tools, visit my web site (also home of jaPBe V3 and PureFORM).
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten