Do you actually need the whole file in memory at any time? If not, I'd just use something like:
public static void CopyStream(Stream input, Stream output)
{
byte[] buffer = new byte[32 * 1024]; // Or whatever size you want
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write(buffer, 0, read);
}
}
Then just open each file accordingly:
using (Stream input = File.OpenRead(...), output = File.OpenWrite(...))
{
CopyStream(input, output);
}