Si no tiene que considerar otros procesos de escritura en el mismo archivo y su proceso de tener crear permisos para el directorio, la forma más eficaz para hacer frente a esto sería :
- crear nuevo archivo con el nombre temporal
- escribir nuevo texto
- Agregar texto de edad de su archivo
- archivo borrado
- archivo de cambio de nombre temp
No será que fresco y rápido, pero al menos no tendría que destinar una gran cadena en la memoria para el enfoque que está utilizando ahora.
Sin embargo, si está seguro de que los archivos van a ser pequeños, como menos de varios megabytes de longitud, su enfoque no es tan malo.
sin embargo, puede posible simplificar el código un poco:
public static void InsertText(string path, string newText)
{
if (File.Exists(path))
{
string oldText = File.ReadAllText(path);
using (var sw = new StreamWriter(path, false))
{
sw.WriteLine(newText);
sw.WriteLine(oldText);
}
}
else File.WriteAllText(path,newText);
}
y para archivos de gran tamaño (es decir,> varios MB)
public static void InsertLarge(string path, string newText)
{
if(!File.Exists(path))
{
File.WriteAllText(path,newText);
return;
}
var pathDir = Path.GetDirectoryName(path);
var tempPath = Path.Combine(pathDir, Guid.NewGuid().ToString("N"));
using (var stream = new FileStream(tempPath, FileMode.Create,
FileAccess.Write, FileShare.None, 4 * 1024 * 1024))
{
using (var sw = new StreamWriter(stream))
{
sw.WriteLine(newText);
sw.Flush();
using (var old = File.OpenRead(path)) old.CopyTo(sw.BaseStream);
}
}
File.Delete(path);
File.Move(tempPath,path);
}
Escribiendo a el inicio del archivo sobrescribirá lo que hay allí. Considere agregar datos al final del archivo en lugar del inicio. – Oded
Tendría que leer todo el archivo, almacenarlo en una cadena, luego insertar sus datos nuevos al principio de esa cadena usando 'String.Insert', luego reescribir el archivo completo con la cadena modificada. –
@ 0 _______ 0 eso es como lo que hice. – hamed