Principales respuestas
Visual Basic - Guardar varias lineas en un archivo.txt

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 SubFavor de su ayuda.
Gracias.
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
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
-
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.
-
>>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
-
-
-
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.textPero no logro agregar la nueva columna, me guarda así :
Columna 1 -----------------------> Columna 2
Así tengo el codigo :
text1.text, text2.text------------> "Vacia"
text1.text, text2.text------------> "Vacia"
text1.text, text2.text------------> "Vacia"
text1.text, text2.text------------> "Vacia"
_stringBuilder.AppendLine(txtFila.Text & "," & txtPalet.Text)
writer.Write(_stringBuilder.ToString())Favor si me podrian ayudar. muchas gracias.
-