No puede volver a escribir una línea sin volver a escribir todo el archivo (a menos que las líneas tengan la misma longitud). Si sus archivos son pequeños, entonces leer todo el archivo objetivo en la memoria y luego escribirlo de nuevo puede tener sentido. Usted puede hacer que de esta manera:
using System;
using System.IO;
class Program
{
static void Main(string[] args)
{
int line_to_edit = 2; // Warning: 1-based indexing!
string sourceFile = "source.txt";
string destinationFile = "target.txt";
// Read the appropriate line from the file.
string lineToWrite = null;
using (StreamReader reader = new StreamReader(sourceFile))
{
for (int i = 1; i <= line_to_edit; ++i)
lineToWrite = reader.ReadLine();
}
if (lineToWrite == null)
throw new InvalidDataException("Line does not exist in " + sourceFile);
// Read the old file.
string[] lines = File.ReadAllLines(destinationFile);
// Write the new file over the old file.
using (StreamWriter writer = new StreamWriter(destinationFile))
{
for (int currentLine = 1; currentLine <= lines.Length; ++currentLine)
{
if (currentLine == line_to_edit)
{
writer.WriteLine(lineToWrite);
}
else
{
writer.WriteLine(lines[currentLine - 1]);
}
}
}
}
}
Si los archivos son grandes sería mejor crear un nuevo archivo para que pueda leer el streaming de un archivo mientras se escribe en la otra. Esto significa que no necesita tener todo el archivo en la memoria a la vez. Puede hacerlo de esta manera:
using System;
using System.IO;
class Program
{
static void Main(string[] args)
{
int line_to_edit = 2;
string sourceFile = "source.txt";
string destinationFile = "target.txt";
string tempFile = "target2.txt";
// Read the appropriate line from the file.
string lineToWrite = null;
using (StreamReader reader = new StreamReader(sourceFile))
{
for (int i = 1; i <= line_to_edit; ++i)
lineToWrite = reader.ReadLine();
}
if (lineToWrite == null)
throw new InvalidDataException("Line does not exist in " + sourceFile);
// Read from the target file and write to a new file.
int line_number = 1;
string line = null;
using (StreamReader reader = new StreamReader(destinationFile))
using (StreamWriter writer = new StreamWriter(tempFile))
{
while ((line = reader.ReadLine()) != null)
{
if (line_number == line_to_edit)
{
writer.WriteLine(lineToWrite);
}
else
{
writer.WriteLine(line);
}
line_number++;
}
}
// TODO: Delete the old file and replace it with the new file here.
}
}
se puede mover después el archivo una vez que esté seguro de que la operación de escritura ha tenido éxito (sin excecption fue arrojado y el escritor está cerrado).
Tenga en cuenta que en ambos casos es un poco confuso que utilice la indexación basada en 1 para sus números de línea. Puede tener más sentido en su código usar la indexación basada en 0. Si lo desea, puede tener un índice basado en 1 en su interfaz de usuario para su programa, pero conviértalo a un índice 0 antes de enviarlo más.
Además, una desventaja de sobrescribir directamente el archivo anterior con el nuevo archivo es que si falla a la mitad, puede perder permanentemente los datos que no se escribieron. Al escribir primero en un tercer archivo, usted solo borra los datos originales después de estar seguro de que tiene otra copia (corregida), de modo que puede recuperar los datos si la computadora se bloquea a la mitad.
Una observación final: noté que sus archivos tenían una extensión xml. Es posible que desee considerar si tiene más sentido utilizar un analizador XML para modificar el contenido de los archivos en lugar de reemplazar líneas específicas.
respuesta Absolutamente genial !!!! ... totalmente a trabajar aquí. ejecutándose en dot net 2.0 ... en Unity3d es: ___ function lineChanger (newText: String, fileName: String, line_to_edit: int) { var arrLine: String [] = File.ReadAllLines (fileName); arrLine [line_to_edit - 1] = newText; File.WriteAllLines (fileName, arrLine); } –
Esto tiene 1 problema, que reescribe todo el archivo. –
esto también carga todo el archivo en la memoria de una vez. pero es probablemente el enfoque más fácil y todavía utilizable con archivos pequeños. –