Datei kopieren

Anfängerfragen zum Programmieren mit PureBasic.
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 »

>> Spielt da vielleicht der Quad-Variablentyp von PB nicht mit? :|
Hab gerade nicht viel Zeit, aber hab keinen Parameter als Quad in der
Funktion gesehen. Werde aber später nochmal schaun, wenn sich sonst
keiner meldet.
Ansonsten ist dies vielleicht interessant für Dich:
http://www.purebasic.fr/german/viewtopi ... highlight=
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
Sicro
Beiträge: 963
Registriert: 11.08.2005 19:08
Kontaktdaten:

Beitrag von Sicro »

Vielen Dank, ts-soft. :wink: Die Funktion ist mir aber schon bekannt.

Die Callback-Funktion benötigt für die ersten 4 Parameter Quad-Variablen. Siehe WinAPI-Auszug:
DWORD WINAPI CopyProgressRoutine(

LARGE_INTEGER TotalFileSize, // total file size, in bytes
LARGE_INTEGER TotalBytesTransferred, // total number of bytes transferred
LARGE_INTEGER StreamSize, // total number of bytes for this stream
LARGE_INTEGER StreamBytesTransferred, // total number of bytes transferred for this stream
DWORD dwStreamNumber, // the current stream
DWORD dwCallbackReason, // reason for callback
HANDLE hSourceFile, // handle to the source file
HANDLE hDestinationFile, // handle to the destination file
LPVOID lpData // passed by CopyFileEx
);
Mfg DerProgger
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 »

Bei mir gehts :D

Code: Alles auswählen

Enumeration
  #PROGRESS_CONTINUE
  #PROGRESS_CANCEL
  #PROGRESS_STOP
  #PROGRESS_QUIET
EndEnumeration


Procedure CopyProgress(TotalFileSize.q, TotalBytesTransferred.q, StreamSize.q, StreamBytesTransferred.q, dwStreamNumber.l, dwCallBackReason.l, hSourceFile.l, lDestinationFile.l, *lpData.l)
  Debug TotalBytesTransferred
  ProcedureReturn #progress_continue
EndProcedure

CopyFileEx_(@"TestFile.txt", @"TestFile.bak", @CopyProgress(), 0, 0, 0)
MfG
Der TS-Soft
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
Sicro
Beiträge: 963
Registriert: 11.08.2005 19:08
Kontaktdaten:

Beitrag von Sicro »

Dein Code geht bei mir auch - selbiges bei meinem Code, wenn ich die Prozentsatz-Berechnung
(sorry, hätte ich erwähnen sollen...) herausnehme :)

Versuche nun mal mit den Parameter-Variablen zu rechnen. Ersetze zum Beispiel die Codezeile
"Debug TotalBytesTransferred" durch "Debug TotalBytesTransferred + 1". Beim Ausführen des
Codes wird dann ein "Invalid memory access"-Fehler ausgelöst und die Codezeile
"ProcedureReturn #progress_continue" markiert.

Mfg DerProgger
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 »

Das ist dasselbe Problem wie bei Threads. Ordne die Werte neuen Variablen
zu. Ansonsten kann es sein, das die API den Wert aktualisiert, während Du
addierst, da ist dann im Speicher was ungültig!

// Nachtrag:
Bei Quads ist PB sowieso etwas langsam, da sind solche Fehler
wahrscheinlicher. Callback ist ja einem Thread ähnlich.
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
Sicro
Beiträge: 963
Registriert: 11.08.2005 19:08
Kontaktdaten:

Beitrag von Sicro »

ts-soft hat geschrieben:Ordne die Werte neuen Variablen zu.
Habe ich auch schon versucht, bringt aber leider nichts.

Mfg DerProgger
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 »

Dann setz #PROGRESS_STOP bis Deine Anzeige fertig ist, danach wieder
#PROGRESS_CONTINUE
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
Sicro
Beiträge: 963
Registriert: 11.08.2005 19:08
Kontaktdaten:

Beitrag von Sicro »

Mit der Konstante "#PROGRESS_STOP" wird der gesamte Kopiervorgang
abgebrochen, die bereits kopierten Daten aber nicht gelöscht.

Ich habe auch schon versucht, CopyFileEx danach immer wieder aufzurufen
bis die komplette Datei kopiert wurde, aber so hat die Variable
"TotalBytesTransferred" immer den Wert "0".

Hat jemand noch eine Idee?

Mfg DerProgger
Antworten