PDA

View Full Version : [Visual basic 2005] Tempo residuo copia di un file


Therock2709
01-11-2007, 13:33
Ciao a tutti,
sto facendo un programma per la copia dei file.
Vorrei creare un CountDown che faccia la stima del tempo rimanente della copia (come quando in win si fa una copia di un file).
In particolare dovrei crearlo per una serie di file messi in un array...

Cmq il mio problema è che non saprei come conoscere la velocità di copia, per il resto poi mi arrangio...

Qualche dritta? :)

CwNd
03-11-2007, 12:41
Prova a dare un occhiata qui:

http://msdn2.microsoft.com/en-us/library/36xbexyf(VS.80).aspx

Nota in particolar modo che vi è un parametro che è showUI che è quello che dovrebbe fare al caso tuo :)


:)

Z3R0`c00l
03-11-2007, 13:24
Ciao a tutti,
sto facendo un programma per la copia dei file.
Vorrei creare un CountDown che faccia la stima del tempo rimanente della copia (come quando in win si fa una copia di un file).
In particolare dovrei crearlo per una serie di file messi in un array...

Cmq il mio problema è che non saprei come conoscere la velocità di copia, per il resto poi mi arrangio...

Qualche dritta? :)

allora... se non ricordo male usando gli stream (writestream e readstream) dovresti poter sapere quanto è stato scritto o letto fino a quel momento... di conseguenza conoscendo la dimensione totale, e impostando un evento temporale che aggiorna la progress bar ogni 500ms o 1000ms dovresti facilmente poter calcolare il tempo rimamente.

CwNd
03-11-2007, 15:07
allora... se non ricordo male usando gli stream (writestream e readstream) dovresti poter sapere quanto è stato scritto o letto fino a quel momento... di conseguenza conoscendo la dimensione totale, e impostando un evento temporale che aggiorna la progress bar ogni 500ms o 1000ms dovresti facilmente poter calcolare il tempo rimamente.

Con quello che gli ho likato *dovrebbe* uscirti direttamente la fienstra come quando copi un file con windows ;)

Z3R0`c00l
03-11-2007, 15:27
Con quello che gli ho likato *dovrebbe* uscirti direttamente la fienstra come quando copi un file con windows ;)

lo so, ma lui non ha chiesto come copiare un file... ma come ricostruire il calcolo del tempo residuo in una copia di file....

cionci
03-11-2007, 15:51
Il calcolo della velocità lo fai secondo stime successive...
Inizialmente non presenti velocità e tempo...dopo che hai trasferito una certa quantità di dati (ad esempio il 5% o 100 KByte in caso il 5% sia troppo grande) calci la velocità di trasferimento ed il tempo rimanente. La velocità puoi ad esempio aggiornarla ogni secondo e di conseguenza il tempo rimanente.

Z3R0`c00l
03-11-2007, 16:12
Il calcolo della velocità lo fai secondo stime successive...
Inizialmente non presenti velocità e tempo...dopo che hai trasferito una certa quantità di dati (ad esempio il 5% o 100 KByte in caso il 5% sia troppo grande) calci la velocità di trasferimento ed il tempo rimanente. La velocità puoi ad esempio aggiornarla ogni secondo e di conseguenza il tempo rimanente.

in realtà potrebbe iniziare a presentare la velocità al primo aggiornamento della quantità di dati trasferiti (conoscerebbe sia la qnt di dati che il tempo impiegato), ma è da considerare che è tutto molto approssimato... l'unica velocità attentidibile è quella calcolata a traferimento effettuato... quindi il tempo rimamente sarebbe molto fluttuante...... un po come fa winrar se tenete presente...

cionci
03-11-2007, 16:18
Certo, è chiaro, ma minore è la quantità di dati minore è la precisione della stima, soprattutto perché all'inizio entrano in gioco le varie bufferizzazioni del SO.

okay
03-11-2007, 17:16
...Vorrei creare un CountDown che faccia la stima del tempo rimanente della copia...


tuo vuoi la stima del tempo alla fine della copia e il tempo rimanente alla fine della copia

...è che non saprei come conoscere la velocità di copia, per il resto poi mi arrangio...


La velocità (si calcola in Byte per Secondi) della copia non è altro che i byte scritti diviso i secondi trascorsi stessa cosa del download di un file dal web che non sono altro che byte scritti/salvati sul pc.


Fai il tutto con quello che ti offre l'api oppure manualmente così:

1. Calcolo dei byte scritti (trasferiti)
2. Tempo impiegato (i secondi che passano)
3. Tempo stimato alla fine (che cambia a seconda della velocità di download)
4. Byte per secondo trasferiti

pseudo code
tempo = Timer - iTime
TotBytes = TotBytes + ByteScritti
TempoStimato= tempo/ TotBytes * ByteTotali (ByteTotali=Lunghezza del file)
BytePerSec = TotBytes / tempo
iTime=Timer

stampa ByteTotali
stampa TotBytes
stampa tempo
stampa TempoStimato
stampa BytePerSec



...In particolare dovrei crearlo per una serie di file messi in un array...


fatto l'algoritmo poi lo usi per il tuo array di file modificandolo con variabili (i).

Therock2709
03-11-2007, 19:04
Ok grazie dei consigli.

In realtà il mio attuale programmino usa proprio l'opzione ShowUI di windows (quello che usa sempre per la copia di un file). Il problema è che apre-chiude una finestrella per ogni file che copia ed è abbastanza fastidioso.

Per l'uso degli stream reader/writer ci avevo pensato, ma volevo implementarlo usando i metodi FileCopy del System.IO. Quindi attualmente non ho traccia dei byte scritti fino a un certo punto :(

Vabbe' vedrò di implementare la copia come un flusso di byte...