24 Stimmen

Was wäre der schnellste Weg, um drei Dateien in C# zu verketten?

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).

42voto

user664769 Punkte 509

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.

27voto

mmx Punkte 400975
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);

7voto

Jimmy Punkte 85199

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

6voto

Kev Punkte 115293

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();

3voto

marc_s Punkte 701497

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.com

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.

Powered by:

X