none
Se necesita una referencia de objeto para el campo, metodo o propiedad no estatico RRS feed

  • Pregunta

  • Hola, he armado el siguiente código para copiar los Logs de una carpeta a otra indicando a partir de que fecha pero me sale el error en "FechaT" se necesita una referencia de objeto para el campo, método o propiedad no estático y si le saco "static" no puedo ejecutar el constructor.

    namespace Copiar_Logs
    {
        public class Copiar : Form1
        { 

    public static void CopiarF ()
            {
                //Se declara las carpetas de Origen
                DirectoryInfo di1 = new DirectoryInfo(@"Ruta Origen");

                //Se declara el Escritorio del usuario
                string fldr = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);

               //Declara el textbox del Form1 y lo transforma en fecha
                DateTime fechaC = DateTime.ParseExact(FechaT.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture);

                //Copia todos los archivos.
                try
                {
                    foreach (var fi in di1.GetFiles("*.txt"))
                    {
                        if (fi.LastWriteTime >= fechaC)
                        {
                            fi.CopyTo(fldr + @"\Logs en ADSM\Server 1");
                        }
                    }
                }
                catch (DirectoryNotFoundException dirEx)
                {
                    throw new Exception(dirEx.Message);
                }
    }
         }
    }  

    Hace mas de 2 años que no programo y me he quedado duro ante este problema.

    Gracias por la ayuda.

                           
    martes, 31 de octubre de 2017 18:49

Respuestas

  • Okey!

    Lo que tenias estaba bien (me refiero a la llave, me habia equivocado yo). Para hacer el cambio que necesitas...

    en primer lugar, declara un string estatico, por ejemplo

    static string strFecha = "";
    


    luego, cambia tu metodo asi:

    public static void CopiarF()
            {
                //Se declara las carpetas de Origen
                DirectoryInfo di1 = new DirectoryInfo(@"Ruta Origen");
    
                //Se declara el Escritorio del usuario
                string fldr = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
    
                //Declara el textbox del Form1 y lo transforma en fecha
                DateTime fechaC = DateTime.ParseExact(strFecha, "dd/MM/yyyy", CultureInfo.InvariantCulture);
    
                //Copia todos los archivos.
                try
                {
                    foreach (var fi in di1.GetFiles("*.txt"))
                    {
                        if (fi.LastWriteTime >= fechaC)
                        {
                            fi.CopyTo(fldr + @"\Logs en ADSM\Server 1");
                        }
                    }
                }
                catch (DirectoryNotFoundException dirEx)
                {
                    throw new Exception(dirEx.Message);
                }
    
            }

    Ahora, solo falta ir poniendo en la variable estatica el contenido del texbox, para eso, añade el evento TextChanged

     private void FechaT_TextChanged(object sender, EventArgs e)
            {
                strFecha = FechaT.Text;
            }

    Con esto, a medida que vayas escribiendo cosas en el textBox, se actualiza la variable estatica, que es la que usas para tu metodo estatico.

    Si tienes dudas comentanos

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    • Marcado como respuesta 20Daniel miércoles, 1 de noviembre de 2017 14:22
    martes, 31 de octubre de 2017 21:15

Todas las respuestas

  • Creo que me falto aclara que Fechat.txt es un Textbox que viene de Form1
    martes, 31 de octubre de 2017 18:55
  • Creo que me falto aclara que Fechat.txt es un Textbox que viene de Form1

    creo que es problema con los slashes revisa este link

    y mira si es por eso

    martes, 31 de octubre de 2017 20:46
  • Buenas,

    Tu problema es que no se puede acceder a una variable NO estatica desde un metodo estatico, esto es debido a que las variables NO estaticas, se crean e inicializan al llamar al constructor no estatico, y esto se hace al instanciar la clase. 

    En cambio, las variables estáticas se inicializan al ejecutarse el constructor estático (el constructor estatico se llama automaticamente al usar un metodo estatico).

    Para lo que tu quieres hacer, una buena opcion seria declarar un string estatico el cual vas escribiendo en el evento textChanged del textbox, de modo que cuando tu escribes algo en el textbox, se va escribiendo en el string estatico, y es a ese string estatico al que accedes desde tu metodo estatico.

    EDITO Y BORRO lo que habia, ya que estaba equivocado


    Si tienes dudas sobre como implementarlo, comentanos y te pongo un ejemplo

    Atte 


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:





    martes, 31 de octubre de 2017 20:55
  • Buenas,

    Tu problema es que no se puede acceder a una variable NO estatica desde un metodo estatico, esto es debido a que las variables NO estaticas, se crean e inicializan al llamar al constructor no estatico, y esto se hace al instanciar la clase. 

    En cambio, las variables estáticas se inicializan al ejecutarse el constructor estático (el constructor estatico se llama automaticamente al usar un metodo estatico).

    Para lo que tu quieres hacer, una buena opcion seria declarar un string estatico el cual vas escribiendo en el evento textChanged del textbox, de modo que cuando tu escribes algo en el textbox, se va escribiendo en el string estatico, y es a ese string estatico al que accedes desde tu metodo estatico.

    Ademas, viendo tu codigo, creo que esta mal, una de las llaves no esta en su posicion:

    namespace Copiar_Logs
    {
        public class Copiar : Form1
        { 
    
        }
        public static void CopiarF ()
        {
                //Se declara las carpetas de Origen
                DirectoryInfo di1 = new DirectoryInfo(@"Ruta Origen");
    
                //Se declara el Escritorio del usuario
                string fldr = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
    
               //Declara el textbox del Form1 y lo transforma en fecha
                DateTime fechaC = DateTime.ParseExact(FechaT.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture);
    
                //Copia todos los archivos.
                try
                {
                    foreach (var fi in di1.GetFiles("*.txt"))
                    {
                        if (fi.LastWriteTime >= fechaC)
                        {
                            fi.CopyTo(fldr + @"\Logs en ADSM\Server 1");
                        }
                    }
                }
                catch (DirectoryNotFoundException dirEx)
                {
                    throw new Exception(dirEx.Message);
                }
    
         } 
    }  
    


    Si tienes dudas sobre como implementarlo, comentanos y te pongo un ejemplo

    Atte 


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:




    Hola, si puedes darme un pequeño ejemplo te lo agradecería...
    martes, 31 de octubre de 2017 21:00
  • Okey!

    Lo que tenias estaba bien (me refiero a la llave, me habia equivocado yo). Para hacer el cambio que necesitas...

    en primer lugar, declara un string estatico, por ejemplo

    static string strFecha = "";
    


    luego, cambia tu metodo asi:

    public static void CopiarF()
            {
                //Se declara las carpetas de Origen
                DirectoryInfo di1 = new DirectoryInfo(@"Ruta Origen");
    
                //Se declara el Escritorio del usuario
                string fldr = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
    
                //Declara el textbox del Form1 y lo transforma en fecha
                DateTime fechaC = DateTime.ParseExact(strFecha, "dd/MM/yyyy", CultureInfo.InvariantCulture);
    
                //Copia todos los archivos.
                try
                {
                    foreach (var fi in di1.GetFiles("*.txt"))
                    {
                        if (fi.LastWriteTime >= fechaC)
                        {
                            fi.CopyTo(fldr + @"\Logs en ADSM\Server 1");
                        }
                    }
                }
                catch (DirectoryNotFoundException dirEx)
                {
                    throw new Exception(dirEx.Message);
                }
    
            }

    Ahora, solo falta ir poniendo en la variable estatica el contenido del texbox, para eso, añade el evento TextChanged

     private void FechaT_TextChanged(object sender, EventArgs e)
            {
                strFecha = FechaT.Text;
            }

    Con esto, a medida que vayas escribiendo cosas en el textBox, se actualiza la variable estatica, que es la que usas para tu metodo estatico.

    Si tienes dudas comentanos

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    • Marcado como respuesta 20Daniel miércoles, 1 de noviembre de 2017 14:22
    martes, 31 de octubre de 2017 21:15