da CopyFile() nicht für große Dateien geeignet ist hab ich hier mal ein threadbasierte Procedure dazu geschrieben, die sehr leicht als Include verwendet werden kann.
Darüber hinaus hat sie keine Globals oder Konstanten, die Probleme im Hauptcode auslösen könnten.
CopyFileEx.pbi
Code: Alles auswählen
; **********************************************************************
;
; CopyFileEx() - PB-Include
;
; Author: Scarabol
; Version: 4.10
; Datum: 14-12-2007
;
; **********************************************************************
;
; CopyFileEx(SourceFile$, TargetFile$)
;
; Beschreibung:
; Erstellt einen Thread der den Inhalte der angegebenen Datei (SourceFile$)
; in die Zieldatei (TargetFile$) kopiert.
;
; Rückgabewert:
; Die Funktion gibt die Thread-Nummer zurück, von dem Thread der die Datei kopiert.
; Sie können diesen jederzeit mit PauseThread anhalten bzw. mit ResumeThread()
; fortsetzen oder KillThread beenden.
;
; !ACHTUNG!
; Wenn sie den Thread während des Vorgangs mit KillThread beenden, bleiben
; die bereits kopierten Daten erhalten.
;
; **********************************************************************
;
; GetCopyFileExState()
;
; Beschreibung:
; Gibt den relativen Anteil der bereits kopierten Daten zurück.
;
; Rückgabewert:
; Die Funktion gibt das Verhältnis Kopiert/Gesamt als Quad-Zahl zurück.
;
; !ACHTUNG!
; Der Parameter wird nur zur internen Verarbeitung verwendet.
;
; **********************************************************************
;
; CopyFileEx() - Example
;
; Define Thread
;
; Declare.f GetCopyFileExState(Var.d = #PB_Default)
; Declare.l CopyFileEx(SourceFile$, TargetFile$)
;
; Thread = CopyFileEx(OpenFileRequester("Datei öffnen...", "", "*.*", 0), SaveFileRequester("Datei speichern...", "", "*.*", 0))
;
; Repeat
; Debug GetCopyFileExState()*100
; Delay(100)
; Until IsThread(Thread) = 0
; End
;
; **********************************************************************
Procedure.f GetCopyFileExState(Var.d = #PB_Default)
Static CopyFileExState.d
If Var = #PB_Default
ProcedureReturn CopyFileExState
Else
CopyFileExState = Var
ProcedureReturn -1
EndIf
EndProcedure
Procedure.l CopyFileExCopy(lpstr)
Protected File1, File2
Protected s.q, s1.q, st.q, Buffer
Protected a$, SourceFile$, TargetFile$
a$ = PeekS(lpstr)
If a$ = ""
ProcedureReturn 0
EndIf
SourceFile$ = StringField(a$, 1, "|")
TargetFile$ = StringField(a$, 2, "|")
Buffer = AllocateMemory(2048)
File1 = ReadFile(#PB_Any, SourceFile$)
If File1
s1 = FileSize(SourceFile$)
If s1 <= 0
ProcedureReturn 0
EndIf
st = s1
File2 = CreateFile(#PB_Any, TargetFile$)
If File2
While s1 > 2048
ReadData(File1, Buffer, 2048)
WriteData(File2, Buffer, 2048)
s1 - 2048
GetCopyFileExState(1-s1/st)
Delay(1)
Wend
ReadData(File1, Buffer, s1)
WriteData(File2, Buffer, s1)
CloseFile(File1)
CloseFile(File2)
ProcedureReturn 1
EndIf
CloseFile(File1)
EndIf
EndProcedure
Procedure.l CopyFileEx(SourceFile$, TargetFile$)
Protected Buffer, Thread
Buffer = AllocateMemory(1024)
PokeS(Buffer, SourceFile$+"|"+TargetFile$)
Thread = CreateThread(@CopyFileExCopy(), Buffer)
ProcedureReturn Thread
EndProcedure
Scarabol