Datei kopieren mit Fortschrittsanzeige
Übersicht

![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
****
Edit: Was ist hier passiert? -.- Angeblich wäre die Verbindung gestört gewesen... Das war eine Lüge! |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
- Zuletzt bearbeitet von mpmxyz am Do, Aug 19, 2010 10:02, insgesamt 2-mal bearbeitet
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Eof nutzt Methoden und Funktionen, die nur 32-Bit-Werte unterstützen.
Da du die Größe der Datei schon kennst, würde ich eher eine Schleife mit einer anderen Bedingung und einem Byte-Zähler nehmen. (Man kann die entsprechenden Stream-Methoden nicht einfach ändern, ohne alles, was mit Streams zu tun hat, neu kompilieren zu müssen und Unkompatibilitäten zu Stream-Erweiterungen zu schaffen.) mfG mpmxyz |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
danibert |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
2 Probleme habe ich noch:
1. Die ProgressBar wird nicht angezeigt, während ich die Kopierfunktion nutze. Wie lässt sich das beheben? 2. Wie kann ich anfallende TStreamWriteExceptions abfangen, wenn beispielsweise der Zieldatenträger voll ist, oder während dem Schreiben entfernt wird, etc. ? Bisher sieht meine Kopierfunktion so aus:BlitzMax: [AUSKLAPPEN] Import maxgui.drivers |
||
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Was mit der Progressbar los ist, weiß ich nicht, aber Exceptions kannst du mit Try abfangen:
BlitzMax: [AUSKLAPPEN] Try mfG mpmxyz |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
![]() |
Thunder |
![]() Antworten mit Zitat ![]() |
---|---|---|
Deine Progressbar wird nicht angezeigt, weil dein Programm während der Kopieraktion nicht mit Windows interagiert, sprich kein PollEvent in der Schleife ausführt.
Außerdem solltest du ProzentTemp erst initialisieren nachdem die Größe für den Pufferspeicher ermittelt wurde, d.h.: BlitzMax: [AUSKLAPPEN]
Nach dem PollEvent in der Funktion wären Abfragen sinnvoll, vielleicht will der Benutzer den Vorgang abbrechen etc. mfg Thunder |
||
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit |
danibert |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@mpmxyz
Ich bekomme Try...Catch nicht mit CopyBytes kombiniert. Wenn ich es wie folgt probiere, bekomme ich jedes Mal einen Fehler, auch wenn da garkeiner ist. BlitzMax: [AUSKLAPPEN] Try Was mache ich hier falsch? |
||
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Was für ein Fehler?
Da würde ich gerne mehr wissen, weil es kein auffälliger Syntax-Fehler zu sein scheint. Das hier solltest du aber nach dem Catch-Teil verschieben, damit die Ressourcen immer und nicht nur im Fehlerfall freigegeben werden: BlitzMax: [AUSKLAPPEN] CloseStream(sourceStream) ; CloseStream(destStream) ; FreeGadget copyProgressBar mfG mpmxyz |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
danibert |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also konkret möchte ich eine unhandled Exception abfangen, wenn der Zieldatenträger voll ist. Ich prüfe das zwar schon vor dem Kopieren, aber wenn gleichzeitig ein anderes Programm auf den Datenträger schreibt, kann dieser ja plötzlich voll sein. Ohne try...catch bekomme ich indiesem Fall eine unhandled Exception, mit ist es immer so als wenn der Datenträger voll ist, auch wenn das nicht der Fall ist.
Ist mein Ansatz mit If Not CopyBytes.... überhaupt richtig? |
||
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe mir eben mal den Quelltext von "CopyBytes" angesehen:
BlitzMax: [AUSKLAPPEN] Function CopyBytes( fromStream:TStream,toStream:TStream,count,bufSize=4096 ) Was fällt dir auf? Es wird nichts zurückgegeben. Daher ist "Not CopyBytes(...)" immer wahr. mfG mpmxyz |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
danibert |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
...darauf bin ich auch gerade gekommen. Rückgaben gibt es laut Doku nur im Fehlerfall in Form einer TStreamReadException bzw. TStreamWriteException..
Wenn ich nun aber statt If Not CopyBytes... If CopyBytes... schreibe, bekomme ich keine unhandled Exception mehr, sondern mein Programm geht einfach aus, sobald das Laufwerk voll ist (egal, ob debug oder release) |
||
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
"If CopyBytes" ist auch sinnlos. Die einzige Rückmeldung dieser Funktion läuft - wie du schon gelesen hast - über Exceptions.
Hast du irgendetwas nach dem gezeigten Code, was das Programm in irgendeiner Weise anhält? Wenn du da nichts in dieser Richtung stehen hast, wird sich das Programm entsprechend schnell beenden. mfG mpmxyz |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
danibert |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
...ja aber wie frage ich denn ab, ob eine Exception vorliegt, wenn nicht mit If CopyBytes...?
Ich kapier´s irgendwie nicht |
||
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Der "Try Catch"-Block erledigt das.
Sobald in einer der dort aufgerufenen Funktionen eine Exception passiert, wird der Teil nach dem Catch ausgeführt und der gesamte Block danach beendet. Die beim Catch angegebene Variable enthält dann das Exception-Objekt bzw. bei einer String-Variable die dazugehörige Fehlermeldung. Wenn außerhalb eines Try Catch-Blocks eine Exception auftaucht, wird diese als Fehlermeldung ausgegeben und das Programm beendet. mfG mpmxyz |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group