Italia
Foro

Erledigt: Blockread / Umrechnung Dateigröße

 

DeHarrow
Hallo an Alle!
Zu meinem Problem: Habe unterschiedliche File, die ich mit Blockread/write kopieren möchte - doch nicht mit: @BlockRead(File$, Ber#, 0, FileSize(File$)), sondern meinetwegen mit 1024 Byte(weise).

Sinn soll sein: Habe eine Progressbar, die den Status des Kopierens Mostra soll. Wäre blöd, wenn dann Ruckzuck 100% angezeigt werden anstatt meinetwegen 10%, 15% kopiert etc.

Wenn ich die Filegröße durch 1024 teile, dann bekomme ich Nachkommastellen, die nicht beachtet werden - die File wird unvollständig kopiert. Aufrunden auf ganze Zahl ohne Kommastelle brachte auch nichts.

Weiß jemand wie ich es am besten anstellen/umrechnen potuto. Bei kleinen File klappt es ja mit dem Wert 1024, aber bei grande File ab MB eben nicht. Hoffe ihr wißt was ich meine.

Saluto Jürgen
 
Angefangen hat alles mit Profan 5.0 ...noch auf Diskette
02.09.2009  
 



Hai, zunächst potuto BlockWrite so viele Byte schreiben, wie die Funktion BlockRead als gelesene Bytes zurückliefert. Die Puffergrösse hängt vom Zielmedium ab von/auf dem die File geladen/geschrieben wird - 1024Byte erscheint mir bei normalen Festplatten und heutigen OSsses als deutlich zu gering. Ich würde vlt. mit einer Puffergrösse von 256KB herantesten - macht ja keinen Sinn die CPU mehr zu quälen als notwendig weil Platte+Cache+OS das "eh" nochmals managen.
 
02.09.2009  
 




DeHarrow
Hallo IF - Danke erstmal per deine Antwort.
Das Problem: ich muß einen Wert ohne Komma rausbekommen.

Habe z.B. eine File von 1079214 Bytes oder 1.02 MB. Wenn ich diesen Wert komplett in den Speicher lese und schreibe, dann ist der Fortschrittsbalken eben gleich bei 100%.
Ok Statusbalken anpassen wäre kein Thema oder so...
...möchte halt nur kleinere Schritte im Statusbalken Mostra lassen (meinetwegen 10%, 20%, 30% kopiert etc.)
Dividiere ich dann durch etwas z.B. FileSize(File$) / 1024 (oder eben größer) um eine andere Bytezahl zu bekommen, dann habe ich Nachkommastellen und es klappt dann eben nicht mit Blockwrite.

Ich müßte sozusagen per unterschiedliche Dateigrößen im Bereich Bytes, KB, MB etc. einen verlässlichen Wert haben.

Saluto Jürgen
 
Angefangen hat alles mit Profan 5.0 ...noch auf Diskette
02.09.2009  
 




Nico
Madysa
Nehmen wir mal an, du habest eine File von 2049 Kilobytes, nur als Beispiel.
Du könntest doch ganzzahlig durch 1024 teilen und dies kopieren. Die Prozentanzeige bekommst du dann nach 100 * GeleseneBytes% / FileSize(datei$). Nach der Schleife, die das macht, ermittelst du mit Modulo einfach die verbleibenden Bytes und kopierst diese auch. Die Prozente müssen danach nicht mehr ausgerechnet werden, es ergeben sich ja 100%.
KompilierenMarkierenSeparieren
whileloop 0,dateigroesse%,1024*1024

    BlockRead(blubber)
    BlockWrite(blabber)
    prozent% = 100 * &loop / dateigroesse%

EndWhile

rest% = dateigroesse% mod (1024 * 1024)
BlockRead(datei$,bereich#,dateigroesse% - rest%,rest%)
BlockWrite(dito)
prozent% = /span>
 
Nico Madysa
02.09.2009  
 



Vlt. meint er sowas: [...] 

(noch mal korrigiert)
KompilierenMarkierenSeparieren
CLS
MYFCOPY("csa.debug","map33.bmp")
WAITINPUT

proc MYFCOPY

    PARAMETERS _FROM$,_TO$

    IFNOT FILEEXISTS(_FROM$)

        RETURN 0

    ENDIF

    IF FILEEXISTS(_TO$)

        ERASE _TO$

        IF FILEEXISTS(_TO$)

            RETURN 0

        ENDIF

    ENDIF

    var SZ!=FILESIZE(_FROM$)

    IF SZ!<20

        COPY _FROM$,_TO$
        RETURN 1

    ENDIF

    var FHFROM%=ASSIGN(_FROM$)
    var FHTO%=ASSIGN(_TO$)

    IFNOT FHFROM% AND FHTO%

        case FHFROM% : ASSIGN FHFROM%,""
        case FHTO% : ASSIGN FHTO%,""
        RETURN 0

    ENDIF

    OPENRW FHFROM%
    OPENRW FHTO%
    var LSZ&=INT(RANGE(SZ!*0.05,20,2048))
    var RD&=0
    var ACC&=0
    DECLARE MYBUFF#
    DIM MYBUFF#,LSZ&

    WHILENOT EOF(FHFROM%)

        RD&=BLOCKREAD(FHFROM%,MYBUFF#,0,LSZ&)

        IFNOT RD&

            BREAK

        ENDIF

        INC ACC&,RD&
        BLOCKWRITE FHTO%,MYBUFF#,0,RD&
        RECTANGLE 0,0 - (ACC&/SZ!*100),10

    ENDWHILE

    DISPOSE MYBUFF#
    ASSIGN FHFROM%,""
    ASSIGN FHTO%,""
    RETURN FILEEXISTS(_TO$)

ss=s4 href='./../../funktionsreferenzen/xprofan/endproc/'>endproc
(achtung code nur hingeschmiert, unbedingt auf fehler checken)
 
02.09.2009  
 




DeHarrow
Hallo!

Danke per die Antworten!
Sieht auf den ersten Blick spitze aus - werde es mal ausprobieren - besten Dank!

Saluto Jürgen
 
Angefangen hat alles mit Profan 5.0 ...noch auf Diskette
02.09.2009  
 



^^
 
02.09.2009  
 




Andreas
Miethe


Zu dem Thema gehört vielleicht auch der System-Dialog, der einen Fortschritt beim Kopieren oder irgendwelchen Berechnungen anzeigt. Hierbei wird ein Fortschrittsbalken und eine Restdauer( die Windwos automatisch berechnet) angezeigt.
KompilierenMarkierenSeparieren
 $H Windows.ph
Var ole& = ImportDll("ole32.dll","")
Var oleaut& = ImportDll("oleaut32.dll","")
Declare bString1$

Proc Ansi2Uni

    Parameters s$
    Var Unicode$ = Space$((Len(S$)*2)+1)
    ~MultiByteToWideChar(0,0,Addr(S$),-1,Addr(Unicode$),Len(Unicode$))
    SysFreeString(bString1$)
    SysFreeString(bString1$)
    bString1$ = SysAllocString(addr(Unicode$))
    Return bString1$

EndProc

DEF &CLSCTX_INPROC_SERVER 1
DEF &PROGDLG_NORMAL 0
DEF &PROGDLG_AUTOTIME 2
DEF &PROGDLG_MODAL 1
DEF &PDTIMER_RESET 1
DEF &IDA_COPY_ANIMATION  160
Interface IProgressDialog
DEF &QueryInterface 0
DEF &AddRef 4
DEF &Release 8
DEF &StartProgressDialog 12
DEF &StopProgressDialog 16
DEF &SetTitle 20
DEF &SetAnimation 24
DEF &HasUserCancelled 28
DEF &SetProgress 32
DEF &SetProgress64 36
DEF &SetLine 40
DEF &SetCancelMsg 44
DEF &Timer 48
Var ProgressLimit& = 5000
Declare CLSID_ProgressDialog#,IID_IProgressDialog#
Dim CLSID_ProgressDialog#,16
Dim IID_IProgressDialog#,16
LONG CLSID_ProgressDialog#,0 = $f8383852
WORD CLSID_ProgressDialog#,4 = $fcd3, $11d1
BYTE CLSID_ProgressDialog#,8 = $a6, $b9, 0, $60, $97, $df, $5b, $d4
LONG IID_IProgressDialog#,0 = $ebbc7c04
WORD IID_IProgressDialog#,4 = $315e, $11d2
BYTE IID_IProgressDialog#,8 = $b6, $2f, 0, $60, $97, $df, $5b, $d4
Var X& = 0
Var dwCompleted& = 0
Var ppv& = 0
cls
CoInitialize(0)
Var hr& = CoCreateInstance(CLSID_ProgressDialog#, 0, &CLSCTX_INPROC_SERVER, IID_IProgressDialog#,Addr(ppv&))

If hr& = ~S_OK

    Var Command& = LONG(ppv&,0)
    Call(Long(Command&,&SetTitle),ppv&,Ansi2Uni("System Fotschritt-Dialogbox"))
    Var hShell& = UseDll("shell32.dll")

    If hShell&

        Call(Long(Command&,&SetAnimation),ppv&,hShell&,&IDA_COPY_ANIMATION)

    EndIf

    Call(Long(Command&,&Timer),ppv&,&PDTIMER_RESET,0)
    Call(Long(Command&,&SetCancelMsg),ppv&,Ansi2Uni("Cancel"), 0)
    Call(Long(Command&,&SetLine),ppv&,1, Ansi2Uni("System Fortschritt-Dialog Test mit XProfan"), 1,0)
    Call(Long(Command&,&StartProgressDialog),ppv&,%hwnd, 0, &PROGDLG_NORMAL | &PROGDLG_AUTOTIME | &PROGDLG_MODAL, 0)

    Repeat

        If Call(Long(Command&,&HasUserCancelled),ppv&)

            Call(Long(Command&,&StopProgressDialog),ppv&)
            MessageBox("Fortschritt abgebrochen","Meldung",0)
            Break

        Else

            Call(Long(Command&,&SetProgress),ppv&, dwCompleted&, ProgressLimit&)

            If dwCompleted& >= ProgressLimit&

                Call(Long(Command&,&StopProgressDialog),ppv&)
                MessageBox("Fortschritt komplett","Meldung",0)
                Break

            Else

                Call(Long(Command&,&SetLine),ppv&,2, Ansi2Uni("Wir sind jetzt hier : "+Str$(dwCompleted&)+" von "+str$(ProgressLimit&)), 1, 0)
                an dieser Stelle könnte man eine Kopierfunktion
                oder irgenwelche Berechnungen einbauen, statt nur einen Zähler laufen zu lassen.
                Inc dwCompleted&

            EndIf

        EndIf

        Sleep 10  je kleiner die Pause, umso schneller der Fortschritt

    Until X& =1

    Call(Long(Command&,&Release),ppv&)
    Dispose CLSID_ProgressDialog#,IID_IProgressDialog#
    SysFreeString(bString1$)

EndIf

CoUninitialize()
FreeDll Ole&
Freedll oleaut&
waitinput
end
 
Gruss
Andreas
________ ________ ________ ________ _
Profan 3.3 - XProfanX2
Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit
ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher
Homepage :  [...] 
05.09.2009  
 



Hehe tolles Beispiel!
 
05.09.2009  
 



Answer


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

4.315 Views

Untitledvor 0 min.
H.Brill19.11.2023
RudiB.07.10.2022
Julian Schmidt05.08.2013
RICOSCH08.01.2013

Themeninformationen



Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie