PDA

Visualizza la versione completa : [C++/CLI] attendere fine di un download asincrono


Rising1
18-12-2012, 22:23
spero di non aver sbagliato sezione
Sto creando un programma per scaricare da internet (pi precisamente da una cartella pubblica di dropbox) dei file pdf (di cui so il link pubblico, salvato nel vettore listaurl)



private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {


//Downloading una variabile bool globale

if(!downloading)
{
downloading=true;

label1->Text="Download in corso";
WebClient^ client = gcnew WebClient;

Uri^ indirizzo = gcnew Uri(listaurl[0]);

client->DownloadFileAsync(indirizzo,"D:\obbiettivamente.pdf");



}


}


a questo punto, mentre il file si sta scaricando, l'utente pu fare altre cose, tranne avviare un altro download.

non appena il download terminato voglio che venga eseguito questo codice



label1->Text="Download completato";

downloading=false;


come posso fare? un problema se ho creato quel webclient localmente all'interno della funzione?

MItaly
19-12-2012, 01:00
Originariamente inviato da Rising1
come posso fare?
Intercetta l'evento DownloadFileCompleted (http://msdn.microsoft.com/it-it/library/system.net.webclient.downloadfilecompleted%28v=vs. 80%29.aspx).

un problema se ho creato quel webclient localmente all'interno della funzione?
Credo di s; anche se allocato sul managed heap, all'uscita della funzione si perde l'unico riferimento con cui raggiungibile dal programma, per cui pu essere distrutto automaticamente dal GC; impostalo come membro della classe.

Rising1
19-12-2012, 15:27
ok grazie! ora funziona :D

Rising1
19-12-2012, 16:07
ultima cosa: per scaricare un file temporaneo ( un file "indice" che contiene tutti gli altri link publici) da cancellare al termine, dove lo posso scaricare in modo tale che su QUALUNQUE windows il file possa essere scaricato, salvato, aperto e chiuso senza ostacoli?

avevo pensato in qualche cartella su C: ma forse sarebbe meglio salvarlo nella stessa cartella dove si trova l'eseguibile, ma come si fa a saperla?

MItaly
19-12-2012, 17:41
Originariamente inviato da Rising1
avevo pensato in qualche cartella su C: ma forse sarebbe meglio salvarlo nella stessa cartella dove si trova l'eseguibile, ma come si fa a saperla?
In c: non ha senso - potresti essere su una macchina che non ha nemmeno c:; tantomeno nella cartella del programma, se il programma installato nella directory giusta gli utenti normali non hanno i diritti per modificare file in tale cartella.
Il posto giusto dove scaricarlo la directory dei file temporanei, che puoi ottenere tramite Environment.GetFolderPath o espandendo la variabile ambiente %tmp%; ma se comunque non ti serve salvare tale file ma solo leggere i dati in esso contenuti, perch usi DownloadFileAsync? Usa DownloadDataAsync, oppure apri uno stream in lettura usando OpenRead. :bh:

Rising1
19-12-2012, 18:55
Originariamente inviato da MItaly
In c: non ha senso - potresti essere su una macchina che non ha nemmeno c:; tantomeno nella cartella del programma, se il programma installato nella directory giusta gli utenti normali non hanno i diritti per modificare file in tale cartella.
Il posto giusto dove scaricarlo la directory dei file temporanei, che puoi ottenere tramite Environment.GetFolderPath o espandendo la variabile ambiente %tmp%; ma se comunque non ti serve salvare tale file ma solo leggere i dati in esso contenuti, perch usi DownloadFileAsync? Usa DownloadDataAsync, oppure apri uno stream in lettura usando OpenRead. :bh:

e per OpenRead che percorso gli passo? direttamente il link pubblico del file su dropbox?

MItaly
19-12-2012, 19:10
Originariamente inviato da Rising1
e per OpenRead che percorso gli passo? direttamente il link pubblico del file su dropbox?
S. (nota che sto parlando della OpenRead metodo di WebClient)

Rising1
19-12-2012, 21:24
Originariamente inviato da MItaly
S. (nota che sto parlando della OpenRead metodo di WebClient)
ok hai fatto bene a specificare perch gi avevo equivocato

Loading