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

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

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

Beitrag 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
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

Alle gucken - keiner lacht...

Gruß
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
lassma-asma
Beiträge: 107
Registriert: 10.07.2007 09:14
Wohnort: Saarland

Beitrag von lassma-asma »

:lol: ( :freak: ) lol?
Gruß lassma-asma

MultiPONG
HANGMAN


PB 3.94 und PureBasic 4.51 !!!
Antworten