Generar un archivo txt con fecha hora y una variable

Iniciado por Meta, 22 Noviembre 2015, 10:23 AM

0 Miembros y 2 Visitantes están viendo este tema.

Meta

Hola:

Uso Visual Studio Community 2015 en español. ;)

Teniendo un formulador Form con C#,incluyo dos botones y un richTextBox, en el cual en el botón 1 si lo pulso, me indica en el richTextBox la fecha y hora y un valor de una variable tipo string que dice "Esto es una prueba".

El el segundo botón, solo genera un archivo txt y en el archiv de texto creado indica en su interior la fecha, hora y el valor de la variable string que comenté arriba.

¿Cómo se hace?

La manera como lo he hecho hasta ahora no es la adecuada, es esta:

Código (csharp) [Seleccionar]
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; // No olvidar.

namespace Generar_txt
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        // Variable.
        string Variable = "Esto es una prueba ";

        string contenido = string.Format("{0:dd/MM/yyyy HH:mm} ", DateTime.Now);

       

        private void button1_Click(object sender, EventArgs e)
        {
            richTextBox1.Text = Variable + contenido;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            // File.WriteAllText(@"c:\carpeta\nombrearch.txt", VAriable + contenido);
            File.WriteAllText(@"nombrearch.txt", Variable + contenido);
        }
    }
}



Da este error porque no crea una carpeta o directorio.


Si usar carpeta si funciona, por si acaso, quiero usar carpeta, ejjejejje.

Otra cosa, cada vez que pulso el botón 2 varias veces, como que se borra lo anterior y se queda lo nuevo.

¿Se puede hacer de alguna manera que se vea poco a poco los datos actualizado sin que se borre nada?

En cada mes quiero que genere un archivo .txt automáticamente, que se llame así por cada archivo: Archivo 22-11-2015.txt.

Saludos.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Lekim

#1
Hola

Te da error  porque el directorio no existe . Primero debes crear el directorio:

Código (csharp) [Seleccionar]
Directory.CreateDirectory(MyDir)

Para añadir texto a un archivo ya creado debes usar AppendAllText (si no hay archivo lo crea):

Código (csharp) [Seleccionar]
File.AppendAllText(FilePath, ContentFile)

Código (csharp) [Seleccionar]

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 WindowsFormsApplication1
{
   public partial class Form1 : Form
   {
       public Form1()
       {
           InitializeComponent();
       }
       // Variable.    
       string Variable = "Esto es una prueba ";        
       string contenido = string.Format("{0:dd/MM/yyyy HH:mm} ", DateTime.Now);
       private void Form1_Load(object sender, EventArgs e)
       {

       }

       private void button1_Click(object sender, EventArgs e)
       {
           richTextBox1.Text = Variable + contenido;
       }

       private void button2_Click(object sender, EventArgs e)        
       {   string sDirectory = @"C:\Carpeta";
           string NameFile = "NombreArchivo.txt";
           string FilePath = string.Format("{0}\\{1}", sDirectory, NameFile);
           string sAddLine = string.Format("{0}{1}{2}", Variable, contenido, Environment.NewLine);
               
           //Si el directorio no existe entonces lo crea
           if (Directory.Exists(sDirectory).Equals(false))
           {
               Directory.CreateDirectory(sDirectory);
           }        
           //Escribe en el archivo      
           File.AppendAllText(FilePath, sAddLine);
           //File.WriteAllText(String.Format("{0}\\{1}", sDirectory, NameFile), Variable + contenido)
           //File.WriteAllText("nombrearch.txt", Variable & contenido)
       }      
   }    
}







Meta

#2
Hola:

Le he cambiado el nombre de las variables proque me gusta más.

Código (csharp) [Seleccionar]
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; // No olvidar.

namespace Generar_txt
{
   public partial class Form1 : Form
   {
       public Form1()
       {
           InitializeComponent();
       }

       // Variable.
       string Variable = "Esto es una prueba ";
       string contenido = string.Format("{0:dd/MM/yyyy HH:mm} ", DateTime.Now);

       private void button1_Click(object sender, EventArgs e)
       {
           richTextBox1.Text = Variable + contenido;
       }

       private void button2_Click(object sender, EventArgs e)
       {
           string Directorio = @"C:\Carpeta";
           string Nombre_del_Archivo = "Archivo_de_Ulises.txt";
           string Archivo_Path = string.Format("{0}\\{1}", Directorio, Nombre_del_Archivo);
           string Agregar_Linea = string.Format("{0}{1}{2}", Variable, contenido, Environment.NewLine);

           //Si el directorio no existe entonces lo crea
           if (Directory.Exists(Directorio).Equals(false))
           {
               Directory.CreateDirectory(Directorio);
           }
           //Escribe en el archivo      
           File.AppendAllText(Archivo_Path, Agregar_Linea);
           richTextBox1.Text += Variable + contenido + "\r\n";
       }
   }
}


Funciona todo a la primera.

Muchísimas gracias mi muy distinguido amigo. ;)


Edito:

Ahora lo hice con el timer en 600000 ms, lo que equivale a 10 minutos, activo el timer con un botón pero hay un problema, que la hora nunca cambia.

Código (csharp) [Seleccionar]
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; // No olvidar.

namespace Generar_txt
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        // Variable.
        string Variable = "Esto es una prueba ";
        string contenido = string.Format("{0:dd/MM/yyyy HH:mm} ", DateTime.Now);

        private void button1_Click(object sender, EventArgs e)
        {
            richTextBox1.Text = Variable + contenido;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            timer1.Enabled = true;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            string Directorio = @"C:\Carpeta";
            string Nombre_del_Archivo = "Archivo_de_Ulises.txt";
            string Archivo_Path = string.Format("{0}\\{1}", Directorio, Nombre_del_Archivo);
            string Agregar_Linea = string.Format("{0}{1}{2}", Variable, contenido, Environment.NewLine);

            //Si el directorio no existe entonces lo crea
            if (Directory.Exists(Directorio).Equals(false))
            {
                Directory.CreateDirectory(Directorio);
            }
            //Escribe en el archivo       
            File.AppendAllText(Archivo_Path, Agregar_Linea);
            richTextBox1.Text += Variable + contenido + "\r\n";
        }
    }
}


¿Algún problema?

Saludos.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Eleкtro

#3
Cita de: Meta en 22 Noviembre 2015, 22:21 PMhay un problema, que la hora nunca cambia.

El problema es que a la variable contenido solo le asignas el valor (la fecha/hora) una única vez...

Tienes que actualizar la variable (fecha/hora) en cada tick, dentro del bloque del handler timer1_Tick.

Saludos








Meta

Hola:

Tengo que poner en el timer lo que dijiste, me imagino que será todo esto.
Código (csharp) [Seleccionar]
string contenido = string.Format("{0:dd/MM/yyyy HH:mm} ", DateTime.Now);

Sigo investigando.

Gracias.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Eleкtro

#5
Cita de: Meta en 23 Noviembre 2015, 15:17 PMme imagino que será todo esto.
Código (csharp) [Seleccionar]
string contenido = string.Format("{0:dd/MM/yyyy HH:mm} ", DateTime.Now);

La variable ya la tienes declarada fuera del método (this.contenido = ...), pero si lo prefieres también puedes hacerlo cómo has expuesto ...declarando dicha variable en cada tick.

Saludos








Meta

#6
Hola:

Parece ser que así si funciona.
Código (csharp) [Seleccionar]
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; // No olvidar.

namespace Generar_txt
{
   public partial class Form1 : Form
   {
       public Form1()
       {
           InitializeComponent();
       }

       // Variable.
       string Variable = "Esto es una prueba ";

       private void button1_Click(object sender, EventArgs e)
       {
           // richTextBox1.Text = Variable + contenido;
       }

       private void button2_Click(object sender, EventArgs e)
       {
           timer1.Enabled = true;
       }

       private void timer1_Tick(object sender, EventArgs e)
       {
           string contenido = string.Format("{0:dd/MM/yyyy HH:mm} ", DateTime.Now);
           string Directorio = @"C:\Carpeta";
           string Nombre_del_Archivo = "Archivo_de_Ulises.txt";
           string Archivo_Path = string.Format("{0}\\{1}", Directorio, Nombre_del_Archivo);
           string Agregar_Linea = string.Format("{0}{1}{2}", Variable, contenido, Environment.NewLine);
 

           //Si el directorio no existe entonces lo crea
           if (Directory.Exists(Directorio).Equals(false))
           {
               Directory.CreateDirectory(Directorio);
           }
           //Escribe en el archivo      
           File.AppendAllText(Archivo_Path, Agregar_Linea);
           richTextBox1.Text += Variable + contenido + "\r\n";
       }
   }
}


Siguiendo con el proyecto. Solo teniendo en el Form1 el richTextBox. En este caso recibo datos en el puerto serie. Cada 600000 ms que son cada 10 minutos, guarda en el txt los datos recibidos del puerto serie y añade la fecha y hora al lado.

Código (csharp) [Seleccionar]
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.IO.Ports;
// No olvidar.
using System.Text;
// No olvidar.
using System.IO;
// No olvidar.

public class Form1
{
// Utilizaremos un string como buffer de recepción.

string Recibidos;
public Form1()
{
FormClosing += Form_Principal_FormClosing;
InitializeComponent();
// Abrir puerto mientras se ejecuta la aplicación.
if (!SerialPort1.IsOpen) {
try {
SerialPort1.Open();
} catch (System.Exception ex) {
MessageBox.Show(ex.ToString());
}
}

// Ejecutar la función Recepcion por disparo del Evento 'DataReived'.
SerialPort1.DataReceived += Recepcion;

}

// Al recibir datos.
private void Recepcion(object sender, SerialDataReceivedEventArgs e)
{
// Acumular los caracteres recibidos a nuestro 'buffer' (string).
Recibidos += SerialPort1.ReadExisting();
// Invocar o llamar al proceso de tramas.
this.Invoke(new EventHandler(Actualizar));
}

// Procesador los datos recibidos en el buffer y extraer tramas copletas.
private void Actualizar(object s, EventArgs e)
{
// Asignar el valor de la trama textBox.
RichTextBox1.Text = Recibidos;

// Selecciona la posición final para leer los mensajes entrantes.
RichTextBox1.SelectionStart = RichTextBox1.Text.Length;

// Mantiene el scroll en la entrada de cada mensaje.
RichTextBox1.ScrollToCaret();
}

// Si cierras el programa.
private void Form_Principal_FormClosing(object sender, FormClosingEventArgs e)
{
// ¿El puerto está abierto?
if (!SerialPort1.IsOpen) {
SerialPort1.Close();
// Cierra el ppuerto.
}
}

private void Timer1_Tick(object sender, EventArgs e)
{
string contenido = string.Format("{0:dd/MM/yyyy HH:mm} ", DateTime.Now);
string Directorio = "C:\\Carpeta_VB";
string Nombre_del_Archivo = "Archivo_de_Ulises.txt";
string Archivo_Path = string.Format("{0}\\{1}", Directorio, Nombre_del_Archivo);
string Agregar_Linea = string.Format("{0}{1}{2}", Recibidos, contenido, Environment.NewLine);

//Si el directorio no existe entonces lo crea
if (Directory.Exists(Directorio).Equals(false)) {
Directory.CreateDirectory(Directorio);
}
//Escribe en el archivo       
File.AppendAllText(Archivo_Path, Agregar_Linea);
RichTextBox1.Text += Recibidos + contenido + Constants.vbCr + Constants.vbLf;
Recibidos = "";
}
}


El problema que no me sale los datos junto con la fecha.

Lo ideal es hacer el programa que guarde los datos recibidos en la variable "Recibidos", más la "fecha y hora" en el richTextBox luego por cada 10 minutos, se guarda en el txt gracias al timer1.

No me sale como quiero. ¿Qué es lo que falla?

Saludos.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Eleкtro

#7
Cita de: Meta en 24 Noviembre 2015, 00:33 AMEl problema que no me sale los datos junto con la fecha.

No me sale como quiero. ¿Qué es lo que falla?

1. ¿Antes de escribir en el control y en el archivo local, has comprobado que el string Recibidos no está vacío?, ¿o qué significa "No me sale como quiero"?.

De todas formas, tema aparte, tienes un lio de nombres de objetos ahí montado, yo te sugiero dejarlo así:

Código (csharp) [Seleccionar]
internal SerialPort SP = new SerialPort(...);
private string dataIn;

private void Recepcion(object sender, SerialDataReceivedEventArgs e)
{
// ...
dataIn += SP.ReadExisting();
// ...
}

private void Timer1_Tick(object sender, EventArgs e)
{
string dirpath = "C:\\Carpeta_VB";
string filepath = Path.Combine(dirpath, "Archivo_de_Ulises.txt");
string dataOut = string.Format("{0}{1:dd/MM/yyyy HH:mm}{2}",
                                      this.dataIn, DateTime.Now.ToString, Environment.NewLine);
       this.dataIn = "";

if (!Directory.Exists(dirpath)) {
Directory.CreateDirectory(dirpath);
}

this.RichTextBox1.AppendText(dataOut);
File.AppendAllText(filepath, dataOut);
}

//=======================================================
//Service provided by Telerik (www.telerik.com)
//=======================================================


saludos