extension - ¿Cuál sería la forma más rápida de concatenar tres archivos en C#?
system io c# (7)
Necesito concatenar 3 archivos usando C #. Un archivo de encabezado, contenido y un archivo de pie de página, pero quiero hacerlo tan genial como se pueda.
Cool = código realmente pequeño o muy rápido (código no ensamblado).
void CopyStream(Stream destination, Stream source) {
int count;
byte[] buffer = new byte[BUFFER_SIZE];
while( (count = source.Read(buffer, 0, buffer.Length)) > 0)
destination.Write(buffer, 0, count);
}
CopyStream(outputFileStream, fileStream1);
CopyStream(outputFileStream, fileStream2);
CopyStream(outputFileStream, fileStream3);
Otra forma ... ¿qué tal si dejas que el sistema operativo lo haga por ti ?:
ProcessStartInfo psi = new ProcessStartInfo("cmd.exe",
String.Format(@" /c copy {0} + {1} + {2} {3}",
file1, file2, file3, dest));
psi.UseShellExecute = false;
Process process = Process.Start(psi);
process.WaitForExit();
¿Te refieres a 3 archivos de texto? ¿El resultado debe ser un archivo nuevamente?
¿Qué tal algo así como:
string contents1 = File.ReadAllText(filename1);
string contents2 = File.ReadAllText(filename2);
string contents3 = File.ReadAllText(filename3);
File.WriteAllText(outputFileName, contents1 + contents2 + contents3);
Por supuesto, con un StringBuilder y un poco de inteligencia adicional, podría extenderlo fácilmente para manejar cualquier cantidad de archivos de entrada :-)
Aclamaciones
No sé C # tan bien, ¿puedes llamar al caparazón desde allí? ¿Puedes hacer algo como
system("type file1 file2 file3 > out");
?
Creo que asintóticamente, esto debería ser muy rápido.
Apoyo a Mehrdad Afshari en que su código es exactamente el mismo que se usa en System.IO.Stream.CopyTo . Todavía me preguntaría por qué no utilizó esa misma función en lugar de reescribir su implementación.
string[] srcFileNames = { "file1.txt", "file2.txt", "file3.txt" };
string destFileName = "destFile.txt";
using (Stream destStream = File.OpenWrite(destFileName))
{
foreach (string srcFileName in srcFileNames)
{
using (Stream srcStream = File.OpenRead(srcFileName))
{
srcStream.CopyTo(destStream);
}
}
}
Según el desensamblador ( ILSpy ), el tamaño del búfer predeterminado es 4096. La función CopyTo tiene una sobrecarga, que le permite especificar el tamaño del búfer en caso de que no esté satisfecho con 4096 bytes.
Si sus archivos son de texto y no son grandes, hay algo que decir sobre el código obsoleto simple y obvio. Yo usaría lo siguiente.
File.ReadAllText("file1") + File.ReadAllText("file2") + File.ReadAllText("file3");
Si sus archivos son archivos de texto grandes y está en Framework 4.0, puede usar File.ReadLines
para evitar almacenar en búfer todo el archivo.
File.WriteAllLines("out", new[] { "file1", "file2", "file3" }.SelectMany(File.ReadLines));
Si sus archivos son binarios, vea la respuesta de Mehrdad