Buscamos por diferentes espacios para así tenerte la solución a tu dilema, en caso de alguna difcultad puedes dejarnos tu inquietud y te responderemos porque estamos para ayudarte.
Solución:
Para muy archivos grandes, haría algo como esto
string tempFile = Path.GetTempFileName();
using(var sr = new StreamReader("file.txt"))
using(var sw = new StreamWriter(tempFile))
string line;
while((line = sr.ReadLine()) != null)
if(line != "removeme")
sw.WriteLine(line);
File.Delete("file.txt");
File.Move(tempFile, "file.txt");
Actualizar Originalmente escribí esto en 2009 y pensé que podría ser interesante con una actualización. Hoy podría lograr lo anterior usando LINQ y ejecución diferida
var tempFile = Path.GetTempFileName();
var linesToKeep = File.ReadLines(fileName).Where(l => l != "removeme");
File.WriteAllLines(tempFile, linesToKeep);
File.Delete(fileName);
File.Move(tempFile, fileName);
El código anterior es casi exactamente igual que el primer ejemplo, lee línea por línea y mantiene una cantidad mínima de datos en la memoria.
Sin embargo, un descargo de responsabilidad podría estar en orden. Dado que aquí estamos hablando de archivos de texto, muy rara vez tendrá que usar el disco como un medio de almacenamiento intermedio. Si no está tratando con archivos de registro muy grandes, no debería haber problemas para leer el contenido en la memoria y evitar tener que lidiar con el archivo temporal.
File.WriteAllLines(fileName,
File.ReadLines(fileName).Where(l => l != "removeme").ToList());
Tenga en cuenta que el .ToList
Aquí es crucial forzar la ejecución inmediata. También tenga en cuenta que todos los ejemplos asumen que los archivos de texto están codificados en UTF-8.
Lea el archivo, elimine la línea en la memoria y vuelva a colocar el contenido en el archivo (sobrescritura). Si el archivo es grande, es posible que desee leerlo línea por línea y crear un archivo temporal, y luego reemplazar el original.
Estoy de acuerdo con John Saunders, esto no es realmente específico de C#. Sin embargo, para responder a su pregunta: básicamente necesita volver a escribir el archivo. hay dos maneras de hacer esto.
- Leer todo el archivo en la memoria (por ejemplo, con
File.ReadAllLines
) - Elimine la línea ofensiva (en este caso, probablemente sea más fácil convertir la string array en una
List
luego elimine la línea) - Escriba todo el resto de las líneas hacia atrás (por ejemplo, con
File.WriteAllLines
) – convertir potencialmente elList
en una string array de nuevo usandoToArray
Sin embargo, eso significa que debes saber que tienes suficiente memoria. Una alternativa:
- Abra tanto el archivo de entrada como un nuevo archivo de salida (como
TextReader
/TextWriter
por ejemplo conFile.OpenText
yFile.CreateText
) - Leer una línea (
TextReader.ReadLine
) – si no desea eliminarlo, escríbalo en el archivo de salida (TextWriter.WriteLine
) - Cuando haya leído todas las líneas, cierre tanto el lector como el escritor (si usa
using
declaraciones para ambos, esto sucederá automáticamente) - Si desea reemplazar la entrada con la salida, elimine el archivo de entrada y luego mueva el archivo de salida a su lugar.