Verfasst: 26.09.2007 11:58
Spielt aber keine Rolle. Die Routine bleibt beim 1. READDATA hängen. Der Callback kommt danach erst.
Das deutsche PureBasic-Forum
https://www.purebasic.fr/german/
Code: Alles auswählen
Prototype MyProgressRoutine(Pos.q, Length.q)
Procedure SK_CopyFile(sourcefile$, targetfile$, OverwriteExistingFile.b=#True, ProgressRoutine.MyProgressRoutine=0, qPackSize.q=0)
; Definitionen
Protected qSourceFileLen.q, qSourceFilePos.q
Protected *CopyBuffer, qDataReaded.q
Protected lSourceFile.l, lTargetFile.l, lResult.l
Protected Memory.MEMORYSTATUS
; Rückgabe-Codes definieren
#SK_CopyFile_Failed = 0 ; #False
#SK_CopyFile_OK = 1 ; #True
#SK_CopyFile_0ByteFile = 2 ; Quell-Datei ist 0 Byte groß
#SK_CopyFile_UserAbort = -1 ; User hat abgebrochen
#SK_CopyFile_FileNotFound = -2 ; Quell-Datei nicht gefunden
#SK_CopyFile_CannotOpenSource = -3 ; Konnte Quelle nicht öffnen
#SK_CopyFile_CannotCreateTarget = -4 ; Konnte Zieldatei nicht anlegen
#SK_CopyFile_TargetCorrupt = -5 ; Source-Size und Target-Size sind unterschiedlich. Ggf, Speicher voll.
#SK_CopyFile_MemoryError = -6 ; Konnte Speicher nicht reservieren
; Standard-Wert für Rückgabe: Fehler!
lResult=#SK_CopyFile_Failed
; Progress-Routine (Aufbaubeispiel)
; Procedure SK_CopyFile_ProgressCallback(act_pos.q, filesize.q)
; If filesize>0
; percentage_done = (act_pos*100)/filesize
; Else
; percentage_done = 100
; EndIf
; SetGadgetState(#main_progressbar_file, percentage_done)
; EndProcedure
; Gibt es Zieldatei schon: User fragen wie es weiter gehen soll!
If FileSize(targetfile$)>0 And OverwriteExistingFile=#False ; Ziel existiert, User will gefragt werden!
If MessageRequester("","Möchten Sie folgende Datei überschreiben?"+#CRLF$+#CRLF$+targetfile$, #PB_MessageRequester_YesNo) = #PB_MessageRequester_No
ProcedureReturn #SK_CopyFile_UserAbort
EndIf
EndIf
; Quelle öffnen
lSourceFile = OpenFile(#PB_Any, sourcefile$)
qSourceFilePos = 0
If IsFile(lSourceFile) ; Quelle öffnen ok?
; Zieldatei erzeugen
lTargetFile = CreateFile(#PB_Any, targetfile$)
If IsFile(lTargetFile) ; Ziel öffnen ok?
; Wieviel arbeit liegt vor uns
qSourceFileLen=Lof(lSourceFile) ; Dateigröße ermitteln
If qSourceFileLen > 0 ; Quelle eine 0-Byte-Datei?
; Paketgröße ermitteln
If qPackSize = 0 ; Dynamische Paketgröße
GlobalMemoryStatus_(Memory.MEMORYSTATUS)
If qSourceFileLen < 3145728 ; 3 MB
qPackSize = qSourceFileLen
ElseIf (qSourceFileLen/100) < (Memory\dwAvailPhys / 4)
qPackSize = qSourceFileLen / 100
Else
qPackSize = (Memory\dwAvailPhys / 1000)
EndIf
EndIf
; Falls ProgressCallback: Startwert eintragen, damit User sieht es passiert was
If ProgressRoutine
ProgressRoutine(1, qSourceFileLen)
EndIf
; Speicher reservieren für Blocks...
*CopyBuffer = AllocateMemory(qPackSize)
If *CopyBuffer ; Speicher ok? Dann los!
Repeat
; Daten aus Quelle einlesen
qDataReaded = ReadData(lSourceFile, *CopyBuffer, qPackSize)
If qDataReaded > 0 ; Daten korrekt gelesen? Dann ab in die Zieldatei
WriteData(lTargetFile, *CopyBuffer, qDataReaded)
qSourceFilePos + qDataReaded
ElseIf qDataReaded = 0 And qSourceFilePos < qSourceFileLen ; Ui, da ging was schief
lResult = #SK_CopyFile_Failed
EndIf
; Progress aktualisieren
If ProgressRoutine And (qDataReaded > 0) And (qSourceFilePos < qSourceFileLen)
ProgressRoutine(qSourceFilePos, qSourceFileLen)
EndIf
Until qSourceFilePos >= qSourceFileLen Or qDataReaded=0 Or bGlobalAbort=#True Or bMainExit=#True
If bGlobalAbort = #True ; Hat User abgebrochen?
lResult = #SK_CopyFile_UserAbort
EndIf
If qSourceFileLen <> qSourceFilePos ; Gibts Probleme mit den Dateigrößen? Differenzen?
lResult = #SK_CopyFile_TargetCorrupt
Debug "Source <> Target"
EndIf
; Speicher wieder freigeben!
FreeMemory(*CopyBuffer)
Else
lResult = #SK_CopyFile_MemoryError ; Probleme beim Speicher reservieren
EndIf
Else
lResult = #SK_CopyFile_0ByteFile ; War ne 0-Byte-Datei
EndIf
; Zieldatei wieder schließen
CloseFile(lTargetFile)
Else
lResult = #SK_CopyFile_CannotCreateTarget ; Zieldatei konnte nicht angelegt werden
EndIf
; Quelldatei wieder schließen
CloseFile(lSourceFile)
; Datum und Attribute wie Originaldatei setzen
SetFileDate(targetfile$, #PB_Date_Created, AddDate(GetFileDate(sourcefile$, #PB_Date_Created), #PB_Date_Hour, UTC_Korrektur))
SetFileDate(targetfile$, #PB_Date_Modified, AddDate(GetFileDate(sourcefile$, #PB_Date_Modified), #PB_Date_Hour, UTC_Korrektur) )
SetFileAttributes(targetfile$, GetFileAttributes(sourcefile$)) ; Attribute angleichen
; Progress lieber nochmal auf 100% setzen
If ProgressRoutine
ProgressRoutine(qSourceFileLen, qSourceFileLen)
EndIf
lResult = #SK_CopyFile_OK ; Super, alles ok
Else
lResult = #SK_CopyFile_CannotOpenSource ; Quelle konnte nicht geöffnet werden :(
EndIf
ProcedureReturn lResult
EndProcedure
Nein liegt es nicht!Agent hat geschrieben:Was soll das ändern? Es liegt wohl eindeutig am ReadData() oder?
Code: Alles auswählen
Prototype.l SK_CopyFile_ProgessCallback(act_pos.q, filesize.q)Code: Alles auswählen
Procedure SK_CopyFile(sourcefile$, targetfile$, *ProgressCallback.l=0, OverwriteExistingFile.b=#True, lBufferSize.l=#False)
CopyFile_Progess.SK_CopyFile_ProgessCallback = @*ProgressCallback
...
EndProcedureAufgerufen habe ich die Kopierroutine wie folgt:Invalid memory access
Code: Alles auswählen
copysuccess.b=SK_CopyFile(CopyList()\entryname$, targetfile$, @SK_CopyFile_ProgressCallback())Code: Alles auswählen
CopyFile_Progess.SK_CopyFile_ProgessCallback = *ProgressCallback
kannst ?Code: Alles auswählen
SK_CopyFile(sourcefile$, targetfile$, 1, 1, 1)
Code: Alles auswählen
Prototype MyProgressRoutine(Pos.q, Length.q)