pregunta sobre ficheros en c# windows forms

Iniciado por rulovive, 20 Enero 2018, 00:17 AM

0 Miembros y 1 Visitante están viendo este tema.

rulovive

maldita duda.... me podrian explicar porque con el primer codigo si pude hacer la apertura, escritura y cierre de un fichero en cada pulsacion del boton, mientras que en el sgundo (habia optado por usar el segundo ya que vi en algunos foros que definir las condiciones de la manipulacion del fichero con filestream era mas "limpio y buena practica"), no me dejaba hacerlo?
otra duda.- porque en el codigo no necesite hacer esto: escribir = new StreamWriter(condiciones);?


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {

       
        StreamWriter escribir;
       
       
       
        public Form1()
        {
           
            InitializeComponent();


           
           
        }

        private void Form1_Load(object sender, EventArgs e)
        {
           
             
           
        }

       

        private void timer1_Tick(object sender, EventArgs e)
        {
            label1.Text = DateTime.Now.ToString();


        }

        private void button1_Click_1(object sender, EventArgs e)
        {
            escribir= File.AppendText("C:\\Users\\Constructora\\Desktop\\ANOTACIONES.txt");
            escribir.WriteLine(label1.Text);
            escribir.Close();
         

        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {

        }
    }
}



esto es lo que pude hacer para abrir, escribir, cerrar y volver a abrr un fichero en cada pulsacion del boton... lo que no entiendo es porque aqui no tuve que usar lo siguiente:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {

        FileStream condiciones = new FileStream("C:\\Users\\Constructora\\Desktop\\ANOTACIONES.txt", FileMode.Open, FileAccess.Write);
        StreamWriter escribir;
       
       
       
        public Form1()
        {
           
            InitializeComponent();


           
           
        }

        private void Form1_Load(object sender, EventArgs e)
        {
           
               
           
        }

       

        private void timer1_Tick(object sender, EventArgs e)
        {
            label1.Text = DateTime.Now.ToString();


        }

        private void button1_Click_1(object sender, EventArgs e)
        {
            escribir = new StreamWriter(condiciones);
            escribir.WriteLine(label1.Text);
            escribir.Close();
           
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {

        }
    }
}

Eleкtro

#1
El problema es que cuando llamas al método 'escribir.Close()', el stream subyacente también se cierra, es decir, internamente 'escribir.Close()' llama a 'condiciones.Close()', y por eso al intentar acceder al stream 'condiciones' por segunda vez no puedes hacer nada ya que el stream lo cerraste.

En general la forma en la que estás haciendo las cosas es poco o nada conveniente, declarar una variable e inicializarla en la misma sentencia creando una instancia, en este caso de la clase FileSream, hacer eso a nivel de clase es un mal hábito de programación, es algo que puede pasar factura en general. Al constructor le estás pasando el argumento FileMode.Open, así que la primera vez que se inicie tu aplicación dará un error al intentar inicializar el Form... a menos que exista el archivo.

Por si no queda claro lo que estoy intentando explicar, a esto le sobra todo lo que está a la derecha del símbolo "=":
Citar
Código (csharp) [Seleccionar]
FileStream condiciones = new FileStream("C:\\Users\\Constructora\\Desktop\\ANOTACIONES.txt", FileMode.Open, FileAccess.Write);
Entonces, quedaría así:
Código (csharp) [Seleccionar]
FileStream condiciones;
...y la inicializarías más tarde con una instancia de la clase FileStream.

De todas formas no necesitas declarar ninguna variable/objeto, basta con que hagas esto en el controlador de evento de tu botón:
Código (csharp) [Seleccionar]
using (FileStream fs = new FileStream(@".\ANOTACIONES.txt", FileMode.Append, FileAccess.Write, FileShare.Read)) {
   using (StreamWriter sw = new StreamWriter(fs)) {
       sw.WriteLine(label1.Text);
   }
}


...pero tampoco necesitas en absoluto hacerlo así, para lo poco que quieres hacer te basta y te sobra con realizar una simple llamada al método System.IO.File.AppendAllText()
Código (csharp) [Seleccionar]
File.AppendAllText(@".\ANOTACIONES.txt", label1.Text, Encoding.Default);

Saludos.








rulovive

sabes que ya dominaba c++ pero c# la verdad es... apasionante, apenas empiezo a aprender pero me ha servido de mucho t explicacion. moraleja: darse un baño de metodos, propiedades y clases en c#... xD gracias!