none
Visual Basic - Guardar varias lineas en un archivo.txt RRS feed

  • Pregunta

  • Hola estimados, le escribo para solicitar su ayuda :

    Tengo un formulario básico con un textboxt  y un boton , en el cual escribo numeros y los quiero ir guardando en un archivo.txt todos en el mismo archivo y que por cada lectura inserte un salto de linea algo asi :

    Lectura 1 :

    N1

    Lectura 2 :

    N1

    N2

    Lectura 3 :

    N1

    N2

    N3

    y que el archivo se guarde y cierre al presionar el boton.

    Tengo lo siguiente, al presionar enter sobre la caja de texto haga la insercion, funciona pero solo me guarda la primera lectura, desconozo como hacerlo enrealidad para registrar lecturas y cerrar el archivo cuando se pulse el boton :

    Private Sub txtPalet_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtPalet.KeyPress
            Dim textoPalet As String

            Dim objStreamWriter As StreamWriter
            objStreamWriter = New StreamWriter("prueba.txt")
            If e.KeyChar = ChrW(Keys.Enter) Then
                textoPalet = txtPalet.Text
                objStreamWriter.WriteLine(textoPalet)
                txtPalet.Text = ""

            End If
            'objStreamWriter.Close()
        End Sub

    Favor de su ayuda.

    Gracias.

    viernes, 25 de mayo de 2018 17:43

Respuestas

  • >>Tengo lo siguiente, al presionar enter sobre la caja de texto haga la insercion, funciona pero solo me guarda >>la primera lectura, desconozo como hacerlo enrealidad para registrar lecturas y cerrar el archivo cuando se >>pulse el boton 

    Tu pregunta dice otra cosa...

    Para hacer lo que pides entonces deberías definir el stream fuera del metodo ya que cada que se llama al evento estas creando un nuevo objeto.

    Private Sub txtPalet_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtPalet.KeyPress
            Dim textoPalet As String
    
            Dim objStreamWriter As StreamWriter
            objStreamWriter = New StreamWriter("prueba.txt", true) 'Aquí estas creando un writer cada que se presiona una tecla
            
                If e.KeyChar = ChrW(Keys.Enter) Then
                textoPalet = txtPalet.Text
                objStreamWriter.WriteLine(textoPalet)
                txtPalet.Text = ""
    
            End If
            'objStreamWriter.Close()
        End Sub

    Realmente no te recomiendo que lo hagas de la forma que dices ya que si lo abres y no lo cierras estarás ocupando un recurso (en este caso bloqueando el archivo para otras posibles escrituras) mientras el programa siga funcionando. Lo cual no considero una buena practica, lo ideal sería usarlo solo cuando se necesite (cuando deseas anexar nueva información). 

    Lo que te puedo recomendar es ir guardando la información en memoria y cuando el usuario haga clic en el botón guardar toda la información leida de golpe ejemplo:

    Imports System.IO
    Imports System.Text
    
    Public Class Form1
        Dim _stringBuilder As StringBuilder
    
        Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress
            If e.KeyChar = ChrW(Keys.Enter) Then
                _stringBuilder.AppendLine(TextBox1.Text) 'Anexamos el texto temporalmente en memoria
            End If
        End Sub
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            _stringBuilder = New StringBuilder()
        End Sub
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            dim writer = new StreamWriter("archivo.txt", True)
            writer.Write(_stringBuilder.ToString()) 'Escribimos lo anexado
            writer.Flush()
            writer.Close()
        End Sub
    End Class

    Si quieres capacidad para deshacer cambios podrias hacerlo usando un List(of String)

    Y por ultimo contestando a tu pregunta tal cual la haces (que no recomiendo hacerlo de esta manera)

    Imports System.IO
    
    Public Class Form1
        Dim _streamWriter As StreamWriter
    
        Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress
            If e.KeyChar = ChrW(Keys.Enter) Then
                _streamWriter.WriteLine(TextBox1.Text) 'escribimos en el archivo
            End If
        End Sub
        
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            _streamWriter = new StreamWriter("text.txt") 'creamos el writer cuando se cree el form (aunque igual puedes hacerlo en un botón tal vez "abrir archivo")
        End Sub
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            'Cerramos el writer
            _streamWriter.Flush()
            _streamWriter.Close()
        End Sub
    End Class

    Nuevamente reitero que este ultimo ejemplo no es recomendable, lo pongo para que veas como se haría.

    No olvides marcarme como respuesta si resolvi tu duda o votarme si te ayude en algo.

    Saludos.

    • Marcado como respuesta FernandoAg viernes, 25 de mayo de 2018 19:42
    viernes, 25 de mayo de 2018 19:08

Todas las respuestas

  • Eso sucede porque el constructor del StreamWriter que estas utilizando sobreescribe el archivo mas información en: Constructor StreamWriter (String) Prueba con la sobrecarga Constructor StreamWriter (String, Boolean)

    Private Sub txtPalet_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtPalet.KeyPress
            Dim textoPalet As String
    
            Dim objStreamWriter As StreamWriter
            objStreamWriter = New StreamWriter("prueba.txt", true)
            If e.KeyChar = ChrW(Keys.Enter) Then
                textoPalet = txtPalet.Text
                objStreamWriter.WriteLine(textoPalet)
                txtPalet.Text = ""
    
            End If
            'objStreamWriter.Close()
        End Sub

    Saludos.

    viernes, 25 de mayo de 2018 17:51
  • Si con eso que me indicas puedo usar append para ir agregando datos, pero mi duda es como hacer o condicionar que no cierre el archivo que cada vez que se presione enter en la caja de texto me inserte una linea en el archivo y que se cierre completamente al pulsar el boton...

    Gracias amigo.

    viernes, 25 de mayo de 2018 18:14
  • >>Tengo lo siguiente, al presionar enter sobre la caja de texto haga la insercion, funciona pero solo me guarda >>la primera lectura, desconozo como hacerlo enrealidad para registrar lecturas y cerrar el archivo cuando se >>pulse el boton 

    Tu pregunta dice otra cosa...

    Para hacer lo que pides entonces deberías definir el stream fuera del metodo ya que cada que se llama al evento estas creando un nuevo objeto.

    Private Sub txtPalet_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtPalet.KeyPress
            Dim textoPalet As String
    
            Dim objStreamWriter As StreamWriter
            objStreamWriter = New StreamWriter("prueba.txt", true) 'Aquí estas creando un writer cada que se presiona una tecla
            
                If e.KeyChar = ChrW(Keys.Enter) Then
                textoPalet = txtPalet.Text
                objStreamWriter.WriteLine(textoPalet)
                txtPalet.Text = ""
    
            End If
            'objStreamWriter.Close()
        End Sub

    Realmente no te recomiendo que lo hagas de la forma que dices ya que si lo abres y no lo cierras estarás ocupando un recurso (en este caso bloqueando el archivo para otras posibles escrituras) mientras el programa siga funcionando. Lo cual no considero una buena practica, lo ideal sería usarlo solo cuando se necesite (cuando deseas anexar nueva información). 

    Lo que te puedo recomendar es ir guardando la información en memoria y cuando el usuario haga clic en el botón guardar toda la información leida de golpe ejemplo:

    Imports System.IO
    Imports System.Text
    
    Public Class Form1
        Dim _stringBuilder As StringBuilder
    
        Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress
            If e.KeyChar = ChrW(Keys.Enter) Then
                _stringBuilder.AppendLine(TextBox1.Text) 'Anexamos el texto temporalmente en memoria
            End If
        End Sub
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            _stringBuilder = New StringBuilder()
        End Sub
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            dim writer = new StreamWriter("archivo.txt", True)
            writer.Write(_stringBuilder.ToString()) 'Escribimos lo anexado
            writer.Flush()
            writer.Close()
        End Sub
    End Class

    Si quieres capacidad para deshacer cambios podrias hacerlo usando un List(of String)

    Y por ultimo contestando a tu pregunta tal cual la haces (que no recomiendo hacerlo de esta manera)

    Imports System.IO
    
    Public Class Form1
        Dim _streamWriter As StreamWriter
    
        Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress
            If e.KeyChar = ChrW(Keys.Enter) Then
                _streamWriter.WriteLine(TextBox1.Text) 'escribimos en el archivo
            End If
        End Sub
        
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            _streamWriter = new StreamWriter("text.txt") 'creamos el writer cuando se cree el form (aunque igual puedes hacerlo en un botón tal vez "abrir archivo")
        End Sub
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            'Cerramos el writer
            _streamWriter.Flush()
            _streamWriter.Close()
        End Sub
    End Class

    Nuevamente reitero que este ultimo ejemplo no es recomendable, lo pongo para que veas como se haría.

    No olvides marcarme como respuesta si resolvi tu duda o votarme si te ayude en algo.

    Saludos.

    • Marcado como respuesta FernandoAg viernes, 25 de mayo de 2018 19:42
    viernes, 25 de mayo de 2018 19:08
  • Tal cual lo mencionaste amigo, lo adapte a mi código y esta perfecto.

    Gracias por la gentileza de la ayuda, marcado como respuesta de inmediato.

    viernes, 25 de mayo de 2018 19:43
  • Respuesta muy completa, justa, clara y valiosa.

    El que sabe sabe!!

    Gracias amigo.

    viernes, 25 de mayo de 2018 19:44
  • Tengo otra duda , necesito guardar el archivo con extension .csv.

    El codigo que tengo (arriba) funciona, pero debo incluir un nuevo textbox que debiese ser otra columna.

    Asi debiese quedar :

    Columna 1 -----------------------> Columna 2
    text1.text ------------------------>text2.text
    text1.text ------------------------>text2.text
    text1.text ------------------------>text2.text
    text1.text ------------------------>text2.text

    Pero no logro agregar la nueva columna, me guarda así :

    Columna 1 -----------------------> Columna 2
    text1.text, text2.text------------> "Vacia"
    text1.text, text2.text------------> "Vacia"
    text1.text, text2.text------------> "Vacia"
    text1.text, text2.text------------> "Vacia"

    Así tengo el codigo :

    _stringBuilder.AppendLine(txtFila.Text & "," & txtPalet.Text)
    writer.Write(_stringBuilder.ToString())

    Favor si me podrian ayudar. muchas gracias.

    miércoles, 30 de mayo de 2018 15:55
  • Sería bueno que nos compartieras el codigo exactamente como lo tienes para poder ver donde se origina el problema.

    Saludos.

    viernes, 1 de junio de 2018 13:58