If you stream your copying, i.e. read a buffer, write a buffer, read a buffer, write a buffer etc until you've run out of data, it will only take as much memory as the buffer size. I expect File.Copy to do this (in the native Windows code, admittedly).
If you want to do it yourself, use something like this:
public void CopyData(Stream input, Stream output)
{
byte[] buffer = new byte[32 * 1024];
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write(buffer, 0, read);
}
}
This will only take 32K however big the stream is.
EDIT: As noted in the comments, the streams may well have their own buffers as well, but the point is that you could still transfer a very large file without running out of memory.