none
Leer un archivo .txt linea por linea RRS feed

  • Pregunta

  • hola comunidad espero me puedan ayudar

    tengo un Listbox el cual lleno automáticamente con direcciones URL, y las cuales se almacenan 1 URL por linea y luego guardo esa informacion en un archivo .txt

    lo que necesito es que al presionar un botón, el código me lea una a una las lineas  del archivo .txt y me abra el navegador y que después de 5 segundos cierre ventana o el navegador como tal  y me abra la siguiente URL que esta en el Listbox. 

    seria algo como esto:

    1. al dar clic en el botón leer linea 0 del archivo .txt

    2. abrir dicha url en el  navegador 

    3. cerrar el navegador después de 5 segundos

    4. repetir todo pero ahora con la url en linea  1 y así sucesivamente hasta terminar de leer todo el archivo .txt

    este es el código que tengo hasta ahora, el de abrir y cerrar el navegador va bien y puedo leer pero solo la primera linea del archivo .txt 

    Con este código soy capaz de lanzar la URL y abrir y cerrar el navegador.

    Private Sub Btn_Abrir_Click(sender As Object, e As EventArgs) Handles Btn_Abrir.Click
    
    'leo el archivo'
            Dim Leer_Lineas_URLs As New System.IO.StreamReader("E:\ROMs.txt", System.Text.Encoding.Default, True)
    'cargo la primera linea con la url'
            Dim Abrir_URL As String = Leer_Lineas_URLs.ReadLine()
    'abro el navegador con la url'
            Process.Start(Abrir_URL)
    'enciendo el conteo regresivo para el cierre automatico del naveador'
            Tiempo.Enabled = True
    'reestablezco el contador del tiempo'
            Cerrado_Automatico = 5
        End Sub
    

    con este código creo el tiempo en que tarda en cerrarse el navegador 

    Private Sub Tiempo_Tick(sender As Object, e As EventArgs) Handles Tiempo.Tick
    'conteo regresivo'
            Cerrado_Automatico = Cerrado_Automatico - 1
    'condición cuando se acaba el tiempo'
            If Cerrado_Automatico = 0 Then
    'búsqueda del proceso que quiero cerrar'
                Buscar_Programa = Process.GetProcessesByName("chrome")
    'condición que se ejecuta para cerrar el programa'
                If Buscar_Programa.Length > 0 Then
                    For Cerrar_Programa = Buscar_Programa.Length - 1 To 0 Step -1
                        Buscar_Programa(Cerrar_Programa).Kill()
                    Next
                End If
    'reestablezco el inicio del conteo regresivo'
                Cerrado_Automatico = 5
    'detengo el tiempo'
                Tiempo.Enabled = False
    
            End If
    
        End Sub
    

    ahora lo que necesito es poder hacer que esto se repita con cada URL que esta en el archivo .txt hasta que ya no hallan mas en la lista





    • Editado macafe lunes, 4 de diciembre de 2017 19:20
    domingo, 3 de diciembre de 2017 19:01

Respuestas

  • Hola. Puedes indicarnos algo de código que lleves implementado? Cual es exactamente tu duda? Leer línea a línea el listbox o abrir el navegador con la URL proporcionada?

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Propuesto como respuesta Pablo Rubio lunes, 4 de diciembre de 2017 15:58
    • Marcado como respuesta Pablo Rubio miércoles, 6 de diciembre de 2017 18:26
    • Desmarcado como respuesta Juan MondragónModerator jueves, 7 de diciembre de 2017 15:53
    • Marcado como respuesta Pablo Rubio jueves, 7 de diciembre de 2017 18:04
    domingo, 3 de diciembre de 2017 21:33

Todas las respuestas

  • Hola. Puedes indicarnos algo de código que lleves implementado? Cual es exactamente tu duda? Leer línea a línea el listbox o abrir el navegador con la URL proporcionada?

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Propuesto como respuesta Pablo Rubio lunes, 4 de diciembre de 2017 15:58
    • Marcado como respuesta Pablo Rubio miércoles, 6 de diciembre de 2017 18:26
    • Desmarcado como respuesta Juan MondragónModerator jueves, 7 de diciembre de 2017 15:53
    • Marcado como respuesta Pablo Rubio jueves, 7 de diciembre de 2017 18:04
    domingo, 3 de diciembre de 2017 21:33
  • Hola macafe

    Para que los colaboradores de este foro puedan brindarte el apoyo necesario, es importante que subas un avance de tu código ya que, es mas sencillo para los colaboradores y para la comunidad, dar una solución pronta.

    Quedamos al pendiente de cualquier actualización de tu parte.

    Saludos Cordiales.

    Gracias por usar los foros de MSDN.

    Pablo Rubio
     _____

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

    lunes, 4 de diciembre de 2017 16:01
  • lo he actualizado y puesto el código que tengo hasta ahora, gracias por la ayuda 

    Julián Jaramillo

    lunes, 4 de diciembre de 2017 18:56
  • Si acaso hay algo "complicado" en el caso que presentas es definir una estrategia para cerrar la ventana del navegador que previamente fue abierta, no sirve detener el proceso que originó el método Start(), aunque veo que ya lo tienes resuelto, sin embargo, dudo que sea una buena estrategia porque ordenas cerrar todas las ventanas, incluso aquellas que no fueron abiertas por la aplicación, en caso hubieran.

    Dim _LineIndex As Integer = 0
    Dim _Lines() As String
    
    Private Sub Btn_Abrir_Click(sender As Object, e As EventArgs) Handles Btn_Abrir.Click
    
    	Dim _Timer As New Timer
    
            _Lines = System.IO.File.ReadAllLines("E:\ROMs.txt", Encoding.Default)
    
    	_Timer.Interval = 5000 '5 segundos
    	AddHandler _Timer.Tick, AddressOf Temporizador_Tick
    	_Timer.Start()
    
    	System.Diagnostics.Process.Start(_Lines(_LineIndex))
    
    End Sub
    
    Private Sub Temporizador_Tick(sender As Object, e As EventArgs)
    
    	'Close browser...
    
    	_LineIndex += 1
    	If _LineIndex < _Lines.GetLength(0) Then
    		System.Diagnostics.Process.Start(_Lines(_LineIndex))
    	Else
    		DirectCast(sender, Timer).Stop()
    	End If
    
    End Sub

    • Propuesto como respuesta Pablo Rubio martes, 5 de diciembre de 2017 16:11
    • Marcado como respuesta Pablo Rubio martes, 5 de diciembre de 2017 19:48
    • Desmarcado como respuesta Juan MondragónModerator miércoles, 6 de diciembre de 2017 15:50
    martes, 5 de diciembre de 2017 5:03
  • el código funciona muy bien, es exactamente lo que necesitaba , tuve un problema con el   Encoding.Default pero lo solucione importando Imports System.Text te agradecería que lo agregaras a tu código por si alguien mas lo necesita no tenga el mismo error.

    es cierto lo que dices de estar cerrando el navegador, pero entonces como cierro una ventana del navegador sin matar todo el proceso como tal?



    Julián Jaramillo

    • Marcado como respuesta macafe martes, 5 de diciembre de 2017 20:36
    • Desmarcado como respuesta macafe martes, 5 de diciembre de 2017 20:36
    martes, 5 de diciembre de 2017 8:34
  • Hola macafe

    Para que las respuestas brindadas por los colaboradores puedan ser útiles para el resto de la comunidad, favor de marcarlas.

    Quedamos al pendiente de cualquier actualización de tu parte.

    Saludos Cordiales.

    Gracias por usar los foros de MSDN.

    Pablo Rubio
     _____

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

    martes, 5 de diciembre de 2017 16:12
  • Si acaso hay algo "complicado" en el caso que presentas es definir una estrategia para cerrar la ventana del navegador que previamente fue abierta, no sirve detener el proceso que originó el método Start(), aunque veo que ya lo tienes resuelto, sin embargo, dudo que sea una buena estrategia porque ordenas cerrar todas las ventanas, incluso aquellas que no fueron abiertas por la aplicación, en caso hubieran.

    Dim _LineIndex As Integer = 0
    Dim _Lines() As String
    
    Private Sub Btn_Abrir_Click(sender As Object, e As EventArgs) Handles Btn_Abrir.Click
    
    	Dim _Timer As New Timer
    
            _Lines = System.IO.File.ReadAllLines("E:\ROMs.txt", Encoding.Default)
    
    	_Timer.Interval = 5000 '5 segundos
    	AddHandler _Timer.Tick, AddressOf Temporizador_Tick
    	_Timer.Start()
    
    	System.Diagnostics.Process.Start(_Lines(_LineIndex))
    
    End Sub
    
    Private Sub Temporizador_Tick(sender As Object, e As EventArgs)
    
    	'Close browser...
    
    	_LineIndex += 1
    	If _LineIndex < _Lines.GetLength(0) Then
    		System.Diagnostics.Process.Start(_Lines(_LineIndex))
    	Else
    		DirectCast(sender, Timer).Stop()
    	End If
    
    End Sub

     

    amigo tengo tres problemas , 

    1. como hago para detener el proceso desde un botón atrás/detener, esta desbocado hasta que termina no para.

    2. tengo problemas con:  

    System.Diagnostics.Process.Start(_Lines(_LineIndex))

    Este es el error que me sale cuando ha terminado de leer el txt y quiero volver a ejecutar el proceso por segunda vez:  System.IndexOutOfRangeException: 'Índice fuera de los límites de la matriz.'

    3. cuando quiero usar la variable _Lines para mostrarlo en un label o Textbox me aparece el error: el valor de tipo string(), no se puede convertir a string.

    espero me puedas ayudar , gracias 


    Julián Jaramillo



    • Editado macafe miércoles, 6 de diciembre de 2017 13:29
    miércoles, 6 de diciembre de 2017 7:39
  • 1. Para detener el temporizador necesitas ejecutar el método Stop() de la instancia de la clase Timer, en consecuencia, debes mover la declaración de la variable '_Timer' a nivel de clase (a la altura de la declaración de las variables '_LineIndex' y '_Lines()'), la instrucción, en el controlador del evento Click, del botón [Detener], será: _Timer.Stop().

    2. Establece el valor de cero a la variable '_LineIndex' cada vez que desees reiniciar el proceso.

    3. Claro, porque la variable '_Lines' es un array, una colección de elementos contiguos, no es un valor escalar, por tanto deberás indicar que elemento de la colección es la que deseas mostrar, por ejemplo, si deseas mostrar la URL "en curso" será: Label1.Text = _Lines(_LineIndex).

    • Propuesto como respuesta Sergio Parra jueves, 7 de diciembre de 2017 19:12
    miércoles, 6 de diciembre de 2017 23:28
  • 1. Para detener el temporizador necesitas ejecutar el método Stop() de la instancia de la clase Timer, en consecuencia, debes mover la declaración de la variable '_Timer' a nivel de clase (a la altura de la declaración de las variables '_LineIndex' y '_Lines()'), la instrucción, en el controlador del evento Click, del botón [Detener], será: _Timer.Stop().

    2. Establece el valor de cero a la variable '_LineIndex' cada vez que desees reiniciar el proceso.

    3. Claro, porque la variable '_Lines' es un array, una colección de elementos contiguos, no es un valor escalar, por tanto deberás indicar que elemento de la colección es la que deseas mostrar, por ejemplo, si deseas mostrar la URL "en curso" será: Label1.Text = _Lines(_LineIndex).

    amigo williams morales, 

    punto 1 y 2 resueltos.

    en el tercer punto ya logro visualizar la url, pero solo la primera de la lista, el Label1.txt no cambia a medida que se va leyendo las lineas del txt.  



    Julián Jaramillo

    jueves, 7 de diciembre de 2017 10:45
  • Entiendo que la asignación del valor, a la etiqueta, la especificas en el controlador del evento 'Temporizador_Tick', ¿verdad?

    Private Sub Temporizador_Tick(sender As Object, e As EventArgs)
    
    	'Close browser...
    
    	_LineIndex += 1
    	If _LineIndex < _Lines.GetLength(0) Then
    		System.Diagnostics.Process.Start(_Lines(_LineIndex))
    	Else
    		DirectCast(sender, Timer).Stop()
    	End If
    	
    	Label1.Text = _Lines(_LineIndex)
    
    End Sub

    Creo que también debes de establecer el valor en el controlador del evento 'Btn_Abrir_Click'. 

    • Propuesto como respuesta Sergio Parra jueves, 7 de diciembre de 2017 19:03
    jueves, 7 de diciembre de 2017 17:52
  • williams morales, perdón por la tardanza en contestar 

    La linea de código por fuera del if sigue causando el mismo error, así que lo puse dentro de la condición, de esa forma también se detiene cuando termina de leer todas la lineas del archivo.txt

    Private Sub Temporizador_Tick(sender As Object, e As EventArgs)
    
    	Close browser...
    
    	_LineIndex += 1
    	If _LineIndex < _Lines.GetLength(0) Then
    		System.Diagnostics.Process.Start(_Lines(_LineIndex))
                     Label1.Text = _Lines(_LineIndex)
    	Else
    		DirectCast(sender, Timer).Stop()
    	End If
    	
    	
    
    End Sub

    y para interrumpir el proceso antes que finalice cree un botón cancelar/ atrás para controlar la parada tanto del temporizador como el intervalo 

     Private Sub Btn_Regresar_Click(sender As Object, e As EventArgs) Handles Btn_Regresar.Click
    
            _Timer.Interval.Stop()
            Temporizador.Stop()
    
    
    End Sub

    te estoy muy agradecido, realmente me ayudaste muchísimo, 

    gracias por tomarte la molestia de leerme y aportar 


    Julián Jaramillo

    sábado, 9 de diciembre de 2017 4:34