Seite 1 von 1

CopyFileEx() - Verbesserung zu CopyFile() für große Dateien

Verfasst: 14.12.2007 16:59
von Scarabol
Hi Leute,

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
Gruß
Scarabol

Verfasst: 23.12.2007 17:06
von Scarabol
Alle gucken - keiner lacht...

Gruß
Scarabol

Verfasst: 23.12.2007 17:12
von lassma-asma
:lol: ( :freak: ) lol?