Ich muss 3 Dateien mit C# verketten. Eine Header-Datei, Inhalt und eine Footer-Datei, aber ich möchte dies so cool tun, wie es getan werden kann.
Cool = wirklich kleiner Code oder wirklich schnell (Nicht-Assembly-Code).
Ich muss 3 Dateien mit C# verketten. Eine Header-Datei, Inhalt und eine Footer-Datei, aber ich möchte dies so cool tun, wie es getan werden kann.
Cool = wirklich kleiner Code oder wirklich schnell (Nicht-Assembly-Code).
Ich unterstütze Mehrdad Afshari darin, dass sein Code genau derselbe ist wie der, der in System.IO.Stream.CopyTo . Ich würde mich trotzdem fragen, warum er nicht dieselbe Funktion verwendet hat, anstatt ihre Implementierung neu zu schreiben.
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);
}
}
}
Laut dem Disassembler ( ILSpy ) ist die Standardpuffergröße 4096. Die Funktion CopyTo verfügt über eine Überladung, mit der Sie die Puffergröße angeben können, falls Sie mit 4096 Byte nicht zufrieden sind.
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);
Wenn Ihre Dateien aus Text bestehen und nicht sehr groß sind, spricht einiges für einen einfachen, offensichtlichen Code. Ich würde den folgenden verwenden.
File.ReadAllText("file1") + File.ReadAllText("file2") + File.ReadAllText("file3");
Wenn es sich bei Ihren Dateien um große Textdateien handelt und Sie mit Framework 4.0 arbeiten, können Sie File.ReadLines
um das Zwischenspeichern der gesamten Datei zu vermeiden.
File.WriteAllLines("out", new[] { "file1", "file2", "file3" }.SelectMany(File.ReadLines));
Wenn Ihre Dateien binär sind, siehe Antwort von Mehrdad
Eine andere Möglichkeit.... wie wäre es, wenn Sie das Betriebssystem die Arbeit für sich erledigen lassen?
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();
Sie meinen 3 Textdateien? Muss das Ergebnis wieder eine Datei sein?
Wie wäre es mit etwas wie:
string contents1 = File.ReadAllText(filename1);
string contents2 = File.ReadAllText(filename2);
string contents3 = File.ReadAllText(filename3);
File.WriteAllText(outputFileName, contents1 + contents2 + contents3);
Natürlich kann man das mit einem StringBuilder und ein bisschen mehr Intelligenz leicht erweitern, um eine beliebige Anzahl von Eingabedateien zu verarbeiten :-)
Prost
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.