Foros del Web » Programación para mayores de 30 ;) » .NET »

¿descargar un archivo al darle a un botón, y ver el progreso y velocidad de descarga?

Estas en el tema de ¿descargar un archivo al darle a un botón, y ver el progreso y velocidad de descarga? en el foro de .NET en Foros del Web. Hola, muy buenas. El problema que tengo es que soy nuevo y por eso no me aclaro... haber, tengo en una pestaña de mi formulario ...
  #1 (permalink)  
Antiguo 06/08/2012, 20:27
 
Fecha de Ingreso: agosto-2012
Mensajes: 5
Antigüedad: 12 años, 3 meses
Puntos: 0
Pregunta ¿descargar un archivo al darle a un botón, y ver el progreso y velocidad de descarga?

Hola, muy buenas.

El problema que tengo es que soy nuevo y por eso no me aclaro...

haber, tengo en una pestaña de mi formulario 5 descargas, cada una en un botón diferente con este código:

Código:
System.Diagnostics.Process.Start("http… del archivo")
se me abre el navegador y empieza la descargar, hasta aquí todo bien.

pero la idea no es esta, es que al darle a descargar, la barra de progreso que tengo en el proyecto avance con la descarga, bueno con todas, cuando le de a un botón se lance el progressbar y cuando pulse otro lo mismo.

tengo el progressbar con un timer, pero esta mas que de adorno, hace el relleno de la barra y se para ya esta.

también me gustaría que en el mismo directorio donde este el programa que he diseñado, cree una carpeta donde guarde las descargas, ya sea data, descargas o lo que sea.

he encontrado como hacer navegadores o programas escribiendo la dirección de descarga y la dirección de guardar, pero no es lo que busco, lo que busco es que solo apretando el botón, descargue y guarde el archivo en la carpeta preestablecida y se cree si no esta en el directorio la carpeta.

edit:

he encontrado este código:

Código:
Function Descargar(ByVal Url As String, ByVal Path_Destino As String) As Boolean
If Url = vbNullString Or Path_Destino = vbNullString Then
MsgBox("No se indicó la url o el archivo de destino", MsgBoxStyle.Critical, "Error")
Else
If Len(Dir(Path_Destino)) <> 0 Then
MsgBox("el archivo ya existe.", MsgBoxStyle.Exclamation, "Error")
Else
On Error Resume Next
My.Computer.Network.DownloadFile(Url, Path_Destino)
If Err.Number = 0 Then
Descargar = True
Else
MsgBox(Err.Description)
End If
Err.Clear()
Shell(Path_Destino)
End If
End If
End Function
y para los botones pongo este código:

Código:
Descargar("http://dirección del archivo", "dirección de guardado")

ahora me queda como enlazarlo a un progressbar genérico para todas las descargas con su timer si debe llevarlo.

para descargar deveria usar usar la clase

WebClient Class

ya que esta expone un evento DownloadProgressChanged

que podría usar para reflejar el progress.

llevo 3 noches enteras acostándome a las 7 de la mañana y no doy con la tela. necesitaría un evento al cual usar con cada botón, y poder ver la barra de progreso con lebel de %, tamaño del archivo y velocidad de descarga.

lo necesito para mi programa y no veo como hacerlo, he escarbado internet afondo, veo con textbox para poner ruta del archivo a descargar y ruta de guardado, pero no es lo q necesito, necesito q al apretar cada botón de descarga, se inicie la descarga correspondiente, toy todo loco, no me sale por mas q lo intento.

es para visual basic 2010.
haber si me pueden echar una mano, y no me sale, descarga, pero no informa.

muchas gracias de antemano al que me pueda echar una ayudita con el código, soy nuevo y agradecería que la explicación sea con detalles .

de verdad muchas gracias.

un saludo .
  #2 (permalink)  
Antiguo 07/08/2012, 12:42
 
Fecha de Ingreso: junio-2011
Mensajes: 15
Antigüedad: 13 años, 5 meses
Puntos: 5
Respuesta: ¿descargar un archivo al darle a un botón, y ver el progreso y velocidad d

debes usar un backgroundWorker y asignarle las propiedades sig.

en el

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
//Todas las cosas de la descarga la url, obtienes el peso del archivo y etc
//en base a eso puedes ir asignando los valores al progressbar
}

en

private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//Voy avanzando la barrita
progressBar_Descargar.Value = e.ProgressPercentage;
}

private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//Cuando se haya acabado la descargo muestro el mensaje
}

esto en C# en VB.NET creo es algo parecido.

Saludos.
  #3 (permalink)  
Antiguo 07/08/2012, 19:12
 
Fecha de Ingreso: agosto-2012
Mensajes: 5
Antigüedad: 12 años, 3 meses
Puntos: 0
Sonrisa Respuesta: ¿descargar un archivo al darle a un botón, y ver el progreso y velocidad d

Cita:
Iniciado por luis404 Ver Mensaje
debes usar un backgroundWorker y asignarle las propiedades sig.

en el

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
//Todas las cosas de la descarga la url, obtienes el peso del archivo y etc
//en base a eso puedes ir asignando los valores al progressbar
}

en

private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//Voy avanzando la barrita
progressBar_Descargar.Value = e.ProgressPercentage;
}

private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//Cuando se haya acabado la descargo muestro el mensaje
}

esto en C# en VB.NET creo es algo parecido.

Saludos.
bien pues esto es lo que he echo hasta ahora, la barra y el % en el label funcionan bien, tambien consegui poner rl total del archivo a descargar y lo que se va descargado en MB.

Bueno si no es ya abusar de vuestra amabilidad, la opción de ver si existe ya el archivo para no descargarlo, y el abrir el archivo cuando concluya la descarga.

añado que puse este código para ver si existe el archivo, siendo positivo, como detendría el proceso para que no hiciese la descarga?
Cita:
If IO.File.Exists("C:\nombre del archivo.exe") Then
MsgBox("El archivo ya fue descargado!", MsgBoxStyle.Exclamation, "Descargado!")
If Err.Number = 0 Then
(que código pondría en este lugar para no proceder a la descarga?)
Else
MsgBox(Err.Description)
End If
Err.Clear()
End If
Mi código actual es este:
Cita:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim client As WebClient = New WebClient
AddHandler client.DownloadProgressChanged, AddressOf client_ProgressChanged
AddHandler client.DownloadFileCompleted, AddressOf client_DownloadCompleted
If IO.File.Exists("C:\archivo.rar") Then 'comprobamos si existe
MsgBox("El archivo ya esta descargado!", MsgBoxStyle.Exclamation, "Descargado!") 'si existe te salta una alerta
If Err.Number = 0 Then
( que pondríamos aquí para detener la descarga antes que la inicie si da error y la continué si no lo da( =0)?)
Else
MsgBox(Err.Description)
End If
Err.Clear()
client.DownloadFileAsync(New Uri("http://archivo a descargar.rar"), "C:\archivo a guardar.rar")
ProgressBar1.Visible = True
Label1.Visible = True
Label2.Visible = True
Label3.Visible = True
Button1.Text = "Descargando..."
Button1.Enabled = False
Button2.Enabled = False
Button4.Enabled = False
Button5.Enabled = False
Button7.Enabled = False
muchas gracias por la ayuda prestada hasta el momento

saludos.

Última edición por wyrms; 07/08/2012 a las 23:57 Razón: añadir información
  #4 (permalink)  
Antiguo 08/08/2012, 12:23
 
Fecha de Ingreso: junio-2011
Mensajes: 15
Antigüedad: 13 años, 5 meses
Puntos: 5
Respuesta: ¿descargar un archivo al darle a un botón, y ver el progreso y velocidad d

pues moverías para ahí tu código

If Err.Number = 0 Then
client.DownloadFileAsync(New Uri("http://archivo a descargar.rar"), "C:\archivo a guardar.rar")
Else

para abrirlo después de descargado

lo pones al final de tu método de descarga

Process.Start("ruta del Archivo")
  #5 (permalink)  
Antiguo 08/08/2012, 13:46
 
Fecha de Ingreso: agosto-2012
Mensajes: 5
Antigüedad: 12 años, 3 meses
Puntos: 0
De acuerdo Respuesta: ¿descargar un archivo al darle a un botón, y ver el progreso y velocidad d

Cita:
Iniciado por luis404 Ver Mensaje
pues moverías para ahí tu código

If Err.Number = 0 Then
client.DownloadFileAsync(New Uri("http://archivo a descargar.rar"), "C:\archivo a guardar.rar")
Else

para abrirlo después de descargado

lo pones al final de tu método de descarga

Process.Start("ruta del Archivo")
en lo referente lo de ejecutar el archivo, obste por que abra el directorio donde dejo todas las descargas.

Código vb:
Ver original
  1. Private Sub Button6_Click(sender As System.Object, e As System.EventArgs) Handles Button6.Click
  2.         Shell("explorer.exe C:\directorio", AppWinStyle.NormalFocus)
  3.     End Sub
pero sigo teniendo el problema que me informa de que el archivo ya existe y aun así procede a la descarga del mismo, saltando el mensaje de archivo descargado.

no debería parar al reportar error en MsgBox al encontrar que existe el archivo?.

no se algo estoy haciendo mal.
Código vb:
Ver original
  1. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
  2.         Dim client As WebClient = New WebClient
  3.         AddHandler client.DownloadProgressChanged, AddressOf client_ProgressChanged
  4.         AddHandler client.DownloadFileCompleted, AddressOf client_DownloadCompleted
  5.         If IO.File.Exists("C:\nombre del archivo.exe") Then 'comprobamos si existe
  6.            MsgBox("El archivo ya esta descargado!", MsgBoxStyle.Exclamation, "Descargado!") 'si existe te salta una alerta
  7.            If Err.Number = 0 Then
  8.                 client.DownloadFileAsync(New Uri("http://archivo a descargar.rar"), "C:\archivo a guardar.rar")
  9.             Else
  10.                 MsgBox(Err.Description)
  11.             End If
  12.             Err.Clear()
  13.         End If
  14.         ProgressBar1.Visible = True
  15.         Label1.Visible = True
  16.         Label2.Visible = True
  17.         Label3.Visible = True
  18.         Button2.Text = "Descargando..."
  19.         Button2.Enabled = False
  20.         Button1.Enabled = False
  21.         Button4.Enabled = False
  22.         Button5.Enabled = False
  23.         Button7.Enabled = False
  24.  
  25.     End Sub

gracias por tu paciencia y ayuda, me sirvió bastante hasta ahora .
  #6 (permalink)  
Antiguo 08/08/2012, 16:34
 
Fecha de Ingreso: junio-2011
Mensajes: 15
Antigüedad: 13 años, 5 meses
Puntos: 5
Respuesta: ¿descargar un archivo al darle a un botón, y ver el progreso y velocidad d

Cita:
If IO.File.Exists("C:\nombre del archivo.exe") Then 'comprobamos si existe
MsgBox("El archivo ya esta descargado!", MsgBoxStyle.Exclamation, "Descargado!") 'si existe te salta una alerta
If Err.Number = 0 Then
client.DownloadFileAsync(New Uri("http://archivo a descargar.rar"), "C:\archivo a guardar.rar")
Else
MsgBox(Err.Description)
End If
Err.Clear()
End If

esta rara esta parte

If Err.Number = 0 Then
client.DownloadFileAsync(New Uri("http://archivo a descargar.rar"), "C:\archivo a guardar.rar")
Else
MsgBox(Err.Description)
End If
Err.Clear()

Quizas seria hacerlo asi


If IO.File.Exists("C:\nombre del archivo.exe") = true Then 'comprobamos si existe
MsgBox("El archivo ya esta descargado!", MsgBoxStyle.Exclamation, "Descargado!") 'si existe te salta una alerta
Else
client.DownloadFileAsync(New Uri("http://archivo a descargar.rar"), "C:\archivo a guardar.rar")
End IF
  #7 (permalink)  
Antiguo 08/08/2012, 20:02
 
Fecha de Ingreso: agosto-2012
Mensajes: 5
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: ¿descargar un archivo al darle a un botón, y ver el progreso y velocidad d

bueno ya lo solucione.
aquí el código de 1 botón, los demás es lo mismo, pero con sus direcciones.
Código vb:
Ver original
  1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  2.         Dim client As WebClient = New WebClient
  3.         AddHandler client.DownloadProgressChanged, AddressOf client_ProgressChanged
  4.         AddHandler client.DownloadFileCompleted, AddressOf client_DownloadCompleted
  5.         If IO.Directory.Exists("C:\descargas_launcher") Then
  6.         Else
  7.             On Error Resume Next
  8.             If Err.Number = 0 Then
  9.                 IO.Directory.CreateDirectory("c:\descargas_launcher")
  10.                 MsgBox("El directorio Descargas_launcher ha sido creado", MsgBoxStyle.Exclamation, "Descargado!")
  11.             Else
  12.                 Err.Clear()
  13.             End If
  14.         End If
  15.         If IO.File.Exists("C:\descargas_launcher\archivo.rar") Then
  16.             MsgBox("El archivo ya esta descargado!", MsgBoxStyle.Exclamation, "Descargado!")
  17.         Else
  18.             On Error Resume Next
  19.             If Err.Number = 0 Then
  20.                 client.DownloadFileAsync(New Uri("http://direción.a.descargar.rar"), "C:\descargas_launcher\dirección.a.guardar.rar")
  21.             Else
  22.                 MsgBox(Err.Description)
  23.             End If
  24.             Err.Clear()
  25.             ProgressBar1.Visible = True
  26.             Label1.Visible = True
  27.             Label2.Visible = True
  28.             Label3.Visible = True
  29.             Button1.Text = "Descargando..."
  30.             Button1.Enabled = False
  31.             Button2.Enabled = False
  32.             Button4.Enabled = False
  33.             Button5.Enabled = False
  34.             Button7.Enabled = False
  35.         End If
  36.     End Sub
lo que me faltaría es poner la velocidad de red de descarga en el progressbar para las descargas en kbps.
aquí dejo el código de los medidores como los tengo:
Código vb:
Ver original
  1. Private Sub client_ProgressChanged(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs)
  2.         Dim bytesIn As Double = Double.Parse(e.BytesReceived.ToString())
  3.         Dim totalBytes As Double = Double.Parse(e.TotalBytesToReceive.ToString())
  4.         Dim percentage As Double = bytesIn / totalBytes * 100
  5.         Label1.Text = CStr(e.ProgressPercentage & (" %"))
  6.         Label2.Text = CStr(bytesIn / 1024 / 1000 & "  MB")
  7.         Label3.Text = CStr(totalBytes / 1024 / 1000 & "  TOTAL MB")
  8.         ProgressBar1.Value = Int32.Parse(Math.Truncate(percentage).ToString())
  9.     End Sub
muchísimas gracias por todo tu apoyo de verdad, me ha servido mucho.
lo que no se como poner es lo ultimo dicho y lo ultimo que necesito :D.

un saludete.

Última edición por wyrms; 08/08/2012 a las 21:32

Etiquetas: vb
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:47.