2011-02-23 18 views
12

Probablemente no haya otra manera de hacerlo, pero ¿hay alguna forma de anexar el contenido de un archivo de texto a otro archivo de texto, borrando el primero después de ¿el movimiento?C#: Anexar * contenidos * de un archivo de texto a otro archivo de texto

La única manera que sé es que sólo tiene que utilizar un lector y escritor, que parece ineficiente para archivos de gran tamaño ...

Gracias!

+0

¿Es la única manera? – CarneyCode

+0

@Carn: ¿Es esa una respuesta vacilante? O bien ... – CODe

+1

No puede "desvincular" bloques de un archivo y "vincularlos" a otro archivo en el nivel SO (incluso porque el punto en los archivos que desea no podría estar en el límite del bloque). Tienes que leer, escribir y luego borrar. Y si quieres hacerlo de forma transaccional ... Bueno ... ¡buena suerte! :-) Esto no es SQL :-) (técnicamente es posible con Windows más nuevo). Si solo quieres hacerlo "normalmente", se trata de 10/20 líneas de código (quizás menos) – xanatos

Respuesta

26

No, no creo que haya nada que lo haga.

Si los dos archivos usan la misma codificación y no necesita verificar que sean válidos, puede tratarlos como archivos binarios, p.

using (Stream input = File.OpenRead("file1.txt")) 
using (Stream output = new FileStream("file2.txt", FileMode.Append, 
             FileAccess.Write, FileShare.None)) 
{ 
    input.CopyTo(output); // Using .NET 4 
} 
File.Delete("file1.txt"); 

Tenga en cuenta que si file1.txt contiene una marca de orden de bytes, debe saltar más allá de esta primera para evitar tener que en el medio de file2.txt.

Si usted no está utilizando .NET 4 puede escribir su propio equivalente de Stream.CopyTo ... incluso con un método de extensión para hacer la entrega sin fisuras:

public static class StreamExtensions 
{ 
    public static void CopyTo(this Stream input, Stream output) 
    { 
     if (input == null) 
     { 
      throw new ArgumentNullException("input"); 
     } 
     if (output == null) 
     { 
      throw new ArgumentNullException("output"); 
     } 
     byte[] buffer = new byte[8192]; 
     int bytesRead; 
     while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0) 
     { 
      output.Write(buffer, 0, bytesRead); 
     } 
    } 
} 
+0

+1 porque nunca habría pensado en "conectar en cascada" los dos usando sin agregar otro nivel de {} .. . Mmmh ... ¿StyleCop lo marcará? – xanatos

+0

@Jon: OpenAppend no parece ser un método de la clase File, ¿te refieres a OpenWrite por casualidad? Además, CopyTo tampoco está disponible, está utilizando System.IO para estos ... ¿no? ¡Gracias por la ayuda! – CODe

+0

@CODe: Whoops, estaba en el medio de verificar que cuando sonó el teléfono. Arreglará. 'Stream.CopyTo' solo está en .NET 4, ¿qué versión estás usando? –

3

La versión cmd.exe esto es

tipo fileOne.txt >> filetwo.txt

del fileOne.txt

Puede crear un shell del sistema para hacer esto. Debería ser bastante eficiente.

+0

Si no desea eliminar fileone.txt pero solo "borrarlo", puede usar 'type nul> fileone.txt'. –

6

Haciendo caso omiso de control de errores, codificaciones, y la eficiencia por el momento, algo como esto sería probablemente el trabajo (pero no lo he probado)

File.AppendAllText("path/to/destination/file", File.ReadAllText("path/to/source/file")); 

A continuación, sólo tiene que borrar o limpiar el primer archivo una vez que este paso esté completo.

+0

Y espero que alguien no tenga una enciclopedia completa en un archivo :-) – xanatos

0

No estoy seguro de lo que quiere decir con "ineficaz". La respuesta de Jon es probablemente suficiente para la mayoría de los casos. Sin embargo, si le preocupan los archivos fuente extremadamente grandes, Memory-Mapped Files podría ser su amigo. Ver this link para más información.

Cuestiones relacionadas