Мне нужно объединить 3 файла с помощью С#. Заголовочный файл, содержимое и нижний колонтитул, но я хочу сделать это как можно круто, как это можно сделать.
Cool = действительно маленький код или действительно быстрый (не-сборочный код).
Мне нужно объединить 3 файла с помощью С#. Заголовочный файл, содержимое и нижний колонтитул, но я хочу сделать это как можно круто, как это можно сделать.
Cool = действительно маленький код или действительно быстрый (не-сборочный код).
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);
Я поддерживаю Мехрдада Афшари в его коде точно так же, как и в 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 байтами.
Если ваши файлы являются текстовыми и не большими, есть что-то, что можно сказать о мертвом простом, очевидном коде. Я бы использовал следующее.
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
Еще один способ... как насчет того, чтобы позволить ОС сделать это за вас?:
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();
Вы имеете в виду 3 текстовых файла? Должен ли результат снова быть файл?
Как насчет чего-то типа:
string contents1 = File.ReadAllText(filename1);
string contents2 = File.ReadAllText(filename2);
string contents3 = File.ReadAllText(filename3);
File.WriteAllText(outputFileName, contents1 + contents2 + contents3);
Конечно, с помощью StringBuilder и немного дополнительных умений вы можете легко расширить это, чтобы обрабатывать любое количество входных файлов: -)
Приветствия
Если вы находитесь в Win32, самым эффективным решением может быть использование функции Win32 API "WriteFile". В VB 6 есть , но переписать его на С# не сложно.
Я не знаю, С# так хорошо - можете ли вы назвать оболочку оттуда? Можете ли вы сделать что-то вроде
system("type file1 file2 file3 > out");
?
Я считаю, что асимптотически это должно быть очень быстро.