none
Eliminar una linea de un archivo de texto en C#

    Pregunta

  • Hola a todos, estoy haciendo un programa que utiliza un archivo de texto en el cual tiene almacenados varios datos de un usuario, con su nombre, contraseña y nivel de accesibilidad, de esta manera;

    Rolando,1,Administrador

    Alfonso,2,Nivel 1

    Entonces necesito eliminar un determinado usuario, por ejemplo  pido que en un textBox  me digiten el nombre de un usuario a eliminar que está guardado en el archivo, entonces mi pregunta es: ¿cómo hago para eliminar un usuario con su contraseña del archivo a través del dato que me digitan en el textbox?, eliminar una linea de achivo txt.

    Nota: Yo utilizé el metodo Split para dividir los datos del usuario separados por una ",".


    Muchas gracias.


    domingo, 17 de julio de 2011 19:02

Respuestas

  • Para eliminar esa fila tendrias que leer linea a linea ese fichero y comprovar si esa linea es la que quieres borrar, entonces cada linea leida se escribe en el fichero sobreescribiendo lo que habia (exceptuando la linea a eliminar).

    Esto de por si no es muy eficiente que digamos, ya que imagino que es una gestion de permisos o similar.

    Yo te recomendaria cargar el contenido de ese fichero en una lista/array y hacer la gestion sobre ese objeto. Y cuando todos lo cambios esten realizados, ahi generas de nuevo tu fichero reemplazando el existente.


    Vota mi respuesta si te ha sido útil. Gracias.
    • Marcado como respuesta rolarcch lunes, 18 de julio de 2011 18:09
    domingo, 17 de julio de 2011 19:38
  • hola

    porque no suas una abse de datos para esto, es mil veces mas simple de trabjar que un archivo, o de ultima un archivo pero como xml, en dodne puedas seelccionar y eliminar un nodo

    el tema como lo haces es que no peude ir a una fila y eliminar proque no es asi como trabajan los archivo

    deberas llerlo completo y volcar el resultado a una archivo temporal, con todos los registros menos el que quieres eliminar

     

    using (StreamWriter fileWrite = new StreamWriter(@"c:\carpeta\temp.txt"))
    {
        using (StreamReader fielRead = new StreamReader(@"c:\carpeta\usuario.txt"))
        {
            String line;
           
            while ((line = fielRead.ReadLine()) != null)
            {
                string[] datos = line.Split(new char[] {','})
                if(datos[0] != txtUsuario.Text)
                {
                    fileWrite.WriteLine(line);
                }
               
            }
        }
    }

    //aqui se renombrea el archivo temporal
    File.Delete("c:\carpeta\usuario.txt")
    File.Move("c:\carpeta\temp.txt", "c:\carpeta\usuario.txt");

     

    como veras lleva unas cuantas linea de codigo

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta rolarcch lunes, 18 de julio de 2011 18:09
    domingo, 17 de julio de 2011 19:47
  • La solución a escoger depende un poco del tamaño del archivo. Si es pequeño, puedes cargarlo todo en memoria, suprimir la línea que sobra, y volverlo a escribir en disco, como propone David Peláez en su respuesta. Si es muy grande, puedes crear un archivo auxiliar en disco sin la línea que sobra, y luego moverlo al archivo "real", como te indica Leandro Tuttini. Y si el archivo es ENORME y requieres alta velocidad en la operación, puedes usar entrada/salida binaria para posicionarte sobre el primer carácter de la línea que sobra y cambiarlo (por ejemplo) por un "*". Lógicamente, el proceso que lee el archivo debe despreciar las líneas que empiezan por dicho carácter. Periódicamente, habrá que hacer una limpieza de estas líneas, que se puede hacer con un código del estilo del que propone Leandro. Pero cuando estás manejando semejantes volúmenes de información, normalmente merece la pena pasar a utilizar una base de datos en lugar de archivos de texto, como tanmbién sugiere Leandro.

    Así que, como ves, todas las respuestas son válidas; todo depende de tus circunstancias particulares, tales como el volumen de información y los requisitos de velocidad y de formato de almacenamiento.

     

     

    • Marcado como respuesta rolarcch lunes, 18 de julio de 2011 18:09
    lunes, 18 de julio de 2011 7:59

Todas las respuestas

  • Para eliminar esa fila tendrias que leer linea a linea ese fichero y comprovar si esa linea es la que quieres borrar, entonces cada linea leida se escribe en el fichero sobreescribiendo lo que habia (exceptuando la linea a eliminar).

    Esto de por si no es muy eficiente que digamos, ya que imagino que es una gestion de permisos o similar.

    Yo te recomendaria cargar el contenido de ese fichero en una lista/array y hacer la gestion sobre ese objeto. Y cuando todos lo cambios esten realizados, ahi generas de nuevo tu fichero reemplazando el existente.


    Vota mi respuesta si te ha sido útil. Gracias.
    • Marcado como respuesta rolarcch lunes, 18 de julio de 2011 18:09
    domingo, 17 de julio de 2011 19:38
  • hola

    porque no suas una abse de datos para esto, es mil veces mas simple de trabjar que un archivo, o de ultima un archivo pero como xml, en dodne puedas seelccionar y eliminar un nodo

    el tema como lo haces es que no peude ir a una fila y eliminar proque no es asi como trabajan los archivo

    deberas llerlo completo y volcar el resultado a una archivo temporal, con todos los registros menos el que quieres eliminar

     

    using (StreamWriter fileWrite = new StreamWriter(@"c:\carpeta\temp.txt"))
    {
        using (StreamReader fielRead = new StreamReader(@"c:\carpeta\usuario.txt"))
        {
            String line;
           
            while ((line = fielRead.ReadLine()) != null)
            {
                string[] datos = line.Split(new char[] {','})
                if(datos[0] != txtUsuario.Text)
                {
                    fileWrite.WriteLine(line);
                }
               
            }
        }
    }

    //aqui se renombrea el archivo temporal
    File.Delete("c:\carpeta\usuario.txt")
    File.Move("c:\carpeta\temp.txt", "c:\carpeta\usuario.txt");

     

    como veras lleva unas cuantas linea de codigo

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta rolarcch lunes, 18 de julio de 2011 18:09
    domingo, 17 de julio de 2011 19:47
  • La solución a escoger depende un poco del tamaño del archivo. Si es pequeño, puedes cargarlo todo en memoria, suprimir la línea que sobra, y volverlo a escribir en disco, como propone David Peláez en su respuesta. Si es muy grande, puedes crear un archivo auxiliar en disco sin la línea que sobra, y luego moverlo al archivo "real", como te indica Leandro Tuttini. Y si el archivo es ENORME y requieres alta velocidad en la operación, puedes usar entrada/salida binaria para posicionarte sobre el primer carácter de la línea que sobra y cambiarlo (por ejemplo) por un "*". Lógicamente, el proceso que lee el archivo debe despreciar las líneas que empiezan por dicho carácter. Periódicamente, habrá que hacer una limpieza de estas líneas, que se puede hacer con un código del estilo del que propone Leandro. Pero cuando estás manejando semejantes volúmenes de información, normalmente merece la pena pasar a utilizar una base de datos en lugar de archivos de texto, como tanmbién sugiere Leandro.

    Así que, como ves, todas las respuestas son válidas; todo depende de tus circunstancias particulares, tales como el volumen de información y los requisitos de velocidad y de formato de almacenamiento.

     

     

    • Marcado como respuesta rolarcch lunes, 18 de julio de 2011 18:09
    lunes, 18 de julio de 2011 7:59