As I just blogged about finding items within a given folder, the same concept can then be enhanced to copy over an entire list with folders and items, to another list of the same structure.
Here is the relevant code -
private void CopyFolderRecursive(
SPFolder folder, SPWeb web, SPList sourceList,
string destinationUrl, SPList destinationList)
{
SPQuery qry = new SPQuery();
qry.Folder = folder;
SPListItemCollection ic = sourceList.GetItems(qry);
SPListItem destinationItem = null;
foreach (SPListItem sourceItem in ic)
{
if (sourceItem.FileSystemObjectType != SPFileSystemObjectType.Folder)
{
destinationItem = destinationList.Items.Add(
destinationUrl + "/" + folder.Url,
sourceItem.FileSystemObjectType);
foreach (SPField destinationField in destinationList.Fields)
{
if ((!destinationField.ReadOnlyField) &&
(destinationField.Type != SPFieldType.Attachments))
{
destinationItem[destinationField.Title] =
sourceItem[destinationField.Title];
}
}
destinationItem.Update();
}
else
{
destinationItem = destinationList.Items.Add(
destinationUrl + "/" + folder.Url,
SPFileSystemObjectType.Folder);
destinationItem["Title"] = sourceItem.Title;
destinationItem.Update();
}
if (sourceItem.Folder != null)
CopyFolderRecursive(
sourceItem.Folder, web, sourceList,
destinationUrl, destinationList);
}
}
The above can be called with a single line of code that looks like this -
CopyFolderRecursive(
sourceList.RootFolder, sourceWeb, sourceList,
destinationSiteURL, destinationList);
As you can see above, I am recursively going over the folder structure, and copying everything I see. If I run into a folder, viz.
if (sourceItem.FileSystemObjectType != SPFileSystemObjectType.Folder)
I create a folder using the following code -
destinationItem = destinationList.Items.Add(
destinationUrl + "/" + folder.Url,
SPFileSystemObjectType.Folder);
destinationItem["Title"] = sourceItem.Title;
destinationItem.Update();
Otherwise, I simply copy over the item field by field -
destinationItem = destinationList.Items.Add(
destinationUrl + "/" + folder.Url,
sourceItem.FileSystemObjectType);
foreach (SPField destinationField in destinationList.Fields)
{
if ((!destinationField.ReadOnlyField) &&
(destinationField.Type != SPFieldType.Attachments))
{
destinationItem[destinationField.Title] =
sourceItem[destinationField.Title];
}
}
destinationItem.Update();
This peice of code can be insanely useful in time of need :-).
Enjoy!