Datei kopieren

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> da zeigt er mir syntax error an.

na, ein bisschen mitarbeiten musst Du schon ;-)

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Maikel hat geschrieben:
Protected FileSource.l, FileDest.l, Mem.l, Size.q Bloecke.q, Rest.q, i.l, Prozent.f


da zeigt er mir syntax error an.
Da fehlt ein Komma, habs oben korrigiert, aber solche kleinen Fehler solltest
Du bereits selber beseitigen können :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Gast

Beitrag von Gast »

stimmt :oops: :oops:
es funktioniert thx für die schnellen antworten an alle die hier gepostet haben. :allright: :allright: :allright:
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Habs nochmal Fehlerbereinigt und Beispiel hinzugefügt. Blockgröße kann jetzt
bestimmt werden, wobei 4096 meist optimal ist, aber man dann bei kleinen
Dateien nicht viel sieht :wink:

Code: Alles auswählen

Procedure CopyFileEx(Source.s, Dest.s, Progressbar.l = #PB_Any, BlockSize.l = 4096)
  Protected FileSource.l, FileDest.l, Mem.l, Size.q, Bloecke.q, Rest.q, i.l, Prozent.f

  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

    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
    Next

    If Rest
      ReadData(FileSource, Mem, Rest)
      WriteData(FileDest, Mem, Rest)
    EndIf
    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, 95, "CopyFileEx") : End : EndIf
If Not CreateGadgetList(WindowID(0)) : End : EndIf

ProgressBarGadget(0, 10, 10, 280, 40, 0, 100, #PB_ProgressBar_Smooth)
ButtonGadget(1, 120, 60, 60, 25, "Start")
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow : Break
    Case #PB_Event_Gadget
      If EventGadget() = 1
        DisableGadget(1, #True)
        CopyFileEx(#PB_Compiler_Home + "PureBasic.chm", GetTemporaryDirectory() + "PureBasic.chm", 0, 20)
        DisableGadget(1, #False)
      EndIf
  EndSelect
ForEver
// Edit
kl. Vorsichtsmaßnahme hinzugefügt :wink:
Zuletzt geändert von ts-soft am 15.11.2006 00:36, insgesamt 1-mal geändert.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
al90
Beiträge: 1103
Registriert: 06.01.2005 23:15
Kontaktdaten:

Beitrag von al90 »

ts-soft hat geschrieben:Habs nochmal Fehlerbereinigt und Beispiel hinzugefügt. Blockgröße kann jetzt
bestimmt werden, wobei 4096 meist optimal ist, aber man dann bei kleinen
Dateien nicht viel sieht :wink:
So ähnlich mache ich es auch immer.

Code: Alles auswählen

blocks.l=x/8192 : rest=x-(blocks*8192)
Bin mir nicht sicher ob die Blockgrösse wirklich erheblichen einfluss auf
den speed nimmt. Mit meiner 8KB grossen Blocksize jedenfalls läuft mein
TC Clone z.Z. genauso schnell wie TC selbst. Was die kleinen Files betrifft
haste allerdings recht. Nix zu sehen, ausser der 2. Processbar die die
Anzahl der Files hochzählt. Ist bei TC aber auch nicht anders und eigentlich
auch logisch. Bin jetzt soweit das ich die OptionPanels erstellen kann und
am ende die Packerunterstützung integriere. Mal sehen, vielleicht noch
ein paar Tage dann werde ich schonmal eine ankündigung machen und
ein paar Screenis uppen. :)

BTW:

Ich würde lieber noch ein:

Code: Alles auswählen

If Bloecke>0
und

Code: Alles auswählen

If Rest>0
einfügen. Meines wissens funzt es auch so, aber ich weis nicht ob es eine
so gute idee ist mit evtl. 0-Bytes einen WriteData() bzw. ReadData() auszuführen.
Du weist ja, sicher ist sicher. :wink:
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

>> Ich würde lieber noch ein:
For Next wird bei 0 nicht ausgeführt, ist doch Kopfgesteuert und ohne Step
geht er auch nicht Rückwärts.
Rest von 0 sollte auch keine Probleme bereiten, aber ist unsauber, da haste
Recht :wink:

PS: Wenn man While Wend statt For Next nimmt und das Ergebnis von
ReadData auswertet, kann man sich die Berechnung sparen. Habs mich aber
bemüht es Anfängerfreundlich zu schreiben :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
al90
Beiträge: 1103
Registriert: 06.01.2005 23:15
Kontaktdaten:

Beitrag von al90 »

ts-soft hat geschrieben:Habs mich aber bemüht es Anfängerfreundlich zu schreiben :wink:
Was genau in dieser Fore auch wichtig ist. Demnach also gut gemacht. :allright:
Gast

Beitrag von Gast »

Wenn ich mal fragen darf (damit ich die rechnung verstehe) wie kommt ihr auf die festgelegten zahlen 8192 und 4096 ?

sind das die bytes ?
Benutzeravatar
al90
Beiträge: 1103
Registriert: 06.01.2005 23:15
Kontaktdaten:

Beitrag von al90 »

Maikel hat geschrieben:Wenn ich mal fragen darf (damit ich die rechnung verstehe) wie kommt ihr auf die festgelegten zahlen 8192 und 4096 ?

sind das die bytes ?
Ja. 4096 = Exakt 4KB und 8192 = 8 KB.
1 KB = Exakt 1024 Bytes
Benutzeravatar
Sicro
Beiträge: 963
Registriert: 11.08.2005 19:08
Kontaktdaten:

Beitrag von Sicro »

Die WinAPI-Funktion "CopyFileEx" gibt ein Callback zurück, das detaillierte Daten
über den Kopierstatus enthält. Allerdings habe ich die Funktion unter PB noch nicht
zum Laufen bekommen.
Spielt da vielleicht der Quad-Variablentyp von PB nicht mit? :|

Mfg DerProgger
Antworten