Подтвердить что ты не робот

Каким будет самый быстрый способ конкатенации трех файлов на С#?

Мне нужно объединить 3 файла с помощью С#. Заголовочный файл, содержимое и нижний колонтитул, но я хочу сделать это как можно круто, как это можно сделать.

Cool = действительно маленький код или действительно быстрый (не-сборочный код).

4b9b3361

Ответ 1

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

Ответ 2

Я поддерживаю Мехрдада Афшари в его коде точно так же, как и в System.IO.Stream.CopyTo. Я все равно задаюсь вопросом, почему он не использовал эту функцию вместо того, чтобы переписывать ее реализацию.

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

В соответствии с дизассемблером (ILSpy) размер буфера по умолчанию равен 4096. Функция CopyTo имеет перегрузку, которая позволяет указать размер буфера, если вы не довольны 4096 байтами.

Ответ 3

Если ваши файлы являются текстовыми и не большими, есть что-то, что можно сказать о мертвом простом, очевидном коде. Я бы использовал следующее.

File.ReadAllText("file1") + File.ReadAllText("file2") + File.ReadAllText("file3");

Если ваши файлы являются большими текстовыми файлами, а вы в Framework 4.0, вы можете использовать File.ReadLines, чтобы избежать буферизации всего файла.

File.WriteAllLines("out", new[] { "file1", "file2", "file3" }.SelectMany(File.ReadLines));

Если ваши файлы двоичные, см. Ответ Mehrdad

Ответ 4

Еще один способ... как насчет того, чтобы позволить ОС сделать это за вас?:

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

Ответ 5

Вы имеете в виду 3 текстовых файла? Должен ли результат снова быть файл?

Как насчет чего-то типа:

string contents1 = File.ReadAllText(filename1);
string contents2 = File.ReadAllText(filename2);
string contents3 = File.ReadAllText(filename3);

File.WriteAllText(outputFileName, contents1 + contents2 + contents3);

Конечно, с помощью StringBuilder и немного дополнительных умений вы можете легко расширить это, чтобы обрабатывать любое количество входных файлов: -)

Приветствия

Ответ 6

Если вы находитесь в Win32, самым эффективным решением может быть использование функции Win32 API "WriteFile". В VB 6 есть , но переписать его на С# не сложно.

Ответ 7

Я не знаю, С# так хорошо - можете ли вы назвать оболочку оттуда? Можете ли вы сделать что-то вроде

 system("type file1 file2 file3 > out"); 

?

Я считаю, что асимптотически это должно быть очень быстро.