Verfasst: 13.11.2006 22:57
Mit gebufferten Files einen Speedtest zu machen ist eher ungeschickt.
FileBuffersSize(#Datei, 0) solltest du schon machen.
FileBuffersSize(#Datei, 0) solltest du schon machen.
Das deutsche PureBasic-Forum
https://www.purebasic.fr/german/
Code: Alles auswählen
Procedure CopyFileEx(Source.s, Dest.s, Progressbar.l = #PB_Any, Datenr.l = #PB_Any, BlockSize.l = 4096)
Protected FileSource.l, FileDest.l, Mem.l, Size.q, Bloecke.q, Rest.q, i.l, Prozent.f, Zeit.l, Datenrate.l
If BlockSize <= 0 : BlockSize = 1 : EndIf
FileSource = ReadFile(#PB_Any, Source)
FileDest = CreateFile(#PB_Any, Dest)
Mem = AllocateMemory(BlockSize)
If FileSource And FileDest And Mem
FileBuffersSize(FileSource, BlockSize)
FileBuffersSize(FileDest, BlockSize)
Size = Lof(FileSource)
Bloecke = Size / BlockSize
Rest = Size % BlockSize
Zeit = ElapsedMilliseconds()
For i = 1 To Bloecke
ReadData(FileSource, Mem, BlockSize)
WriteData(FileDest, Mem, BlockSize)
Prozent = ((BlockSize * i) / Size) * 100
If Progressbar > #PB_Any And IsGadget(Progressbar)
SetGadgetState(Progressbar, Prozent)
EndIf
If (timeGetTime_() - Zeit) / 1000
Datenrate = ((i * BlockSize) / ((ElapsedMilliseconds() - Zeit) / 1000)) / 1048576
If Datenr > #PB_Any And IsGadget(Datenr)
SetGadgetText(Datenr, Str(Datenrate))
EndIf
EndIf
Next
ReadData(FileSource, Mem, Rest)
WriteData(FileDest, Mem, Rest)
If Progressbar > #PB_Any And IsGadget(Progressbar)
SetGadgetState(Progressbar, 100)
EndIf
FreeMemory(Mem)
CloseFile(FileSource)
CloseFile(FileDest)
If FileSize(Dest) > 0
ProcedureReturn #True
EndIf
EndIf
ProcedureReturn #False
EndProcedure
If Not OpenWindow(0, #PB_Ignore, 0, 300, 135, "CopyFileEx") : End : EndIf
If Not CreateGadgetList(WindowID(0)) : End : EndIf
ProgressBarGadget(0, 10, 10, 280, 40, 0, 100, #PB_ProgressBar_Smooth)
TextGadget(1, 10, 60, 280, 20, "", #PB_Text_Center)
ButtonGadget(2, 120, 90, 60, 25, "Start")
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow : Break
Case #PB_Event_Gadget
If EventGadget() = 2
DisableGadget(1, #True)
CopyFileEx("/home/mknjc/Progen/Bastelspass/Riesendatei", GetTemporaryDirectory() + "Testdata", 0, 1, 102400)
DisableGadget(1, #False)
EndIf
EndSelect
ForEver