Nouvelle réponse
(Voir l'explication pour junking réponse originale ci-dessous.)
static void CopyFiles(string dest, params string[] sources)
{
using (TextWriter writer = File.CreateText(dest))
{
// Somewhat arbitrary limit, but it won't go on the large object heap
char[] buffer = new char[16 * 1024];
foreach (string source in sources)
{
using (TextReader reader = File.OpenText(source))
{
int charsRead;
while ((charsRead = reader.Read(buffer, 0, buffer.Length)) > 0)
{
writer.Write(buffer, 0, charsRead);
}
}
}
}
}
Cette nouvelle réponse est tout à fait comme l'approche de Martin, à l'exception:
- Il se lit dans un tampon plus petit; 16K va être acceptable dans presque toutes les situations, et ne finira pas sur le tas d'objets volumineux (qui ne soit pas compactée)
- Il lit texte données au lieu de données binaires, pour deux raisons:
- le code peut facilement être modifié pour convertir d'un encodage à un autre
- Si chaque fichier d'entrée contient une marque d'ordre d'octet, qui sera ignoré par le lecteur, au lieu de se retrouver avec des marques octet ordre dispersé à travers le fichier de sortie aux limites du fichier d'entrée
réponse originale
Martin Stettner a souligné un problème dans la réponse ci-dessous - si le premier fichier se termine sans un saut de ligne, il sera toujours créer une nouvelle ligne dans le fichier de sortie. En outre, il traduira les nouvelles lignes dans le "\ r \ n" même si elles étaient auparavant juste "\ r" ou "\ n". Enfin, il risque inutilement d'utiliser de grandes quantités de données pour les longues lignes.
Quelque chose comme:
static void CopyFiles(string dest, params string[] sources)
{
using (TextWriter writer = File.CreateText(dest))
{
foreach (string source in sources)
{
using (TextReader reader = File.OpenText(source))
{
string line;
while ((line = reader.ReadLine()) != null)
{
writer.WriteLine(line);
}
}
}
}
}
Notez que ce lit ligne par ligne pour éviter de lire trop en mémoire à la fois. Vous pouvez le rendre plus simple si vous êtes heureux de lire complètement chaque fichier dans la mémoire (encore un à la fois):
static void CopyFiles(string dest, params string[] sources)
{
using (TextWriter writer = File.CreateText(dest))
{
foreach (string source in sources)
{
string text = File.ReadAllText(source);
writer.Write(text);
}
}
}
Skeet me bat à nouveau! – jrcs3
Il a juste jeté un coup d'oeil à son clavier et il a commencé à taper la réponse avec la vitesse de la lumière.:) –
Skeet doit être un android. Il ne peut pas être humain. +1 – ichiban