SharePoint has great built in methods to copy or move documents across sub-sites or lists within the same site collection. You can use SPFile.MoveTo or SPFilem.CopyTo. You can even move whole folders and their contents with the SPFolder.MoveTo method. Very nice. Unfortunately, these do not work across site collections. However you can use the object model and a little bit of recursion to copy folders across site collections. The following code takes the url string to the source site collection, url string to the destination site collection, the name of the document library, the url string for the folder and the folder name.
SPFolder destFolder = destWeb.GetFolder(folderUrl);
foreach (SPFile file in sourceFolder.Files)
foreach (SPFolder folder in sourceFolder.SubFolders)
The SPFolder.Files.Add has many overloaded methods. You can decrease the amount of memory by using a stream object instead of the byte array returned by the SPFile.OpenBinary. You can also add metadata by populating a hashtable and sending that.