private void MoveProjectItems(ProjectItems sourceProjectItems, IFolder targetFolder, string sourceName, string targetName) { // Keep a list of items that have been moved so that we don't modify the sourceProjectItems enumerable. var itemsToDeleteFromSource = new List<ProjectItem>(); foreach (ProjectItem item in sourceProjectItems) { string itemName = item.Name; if (item.IsOpen && item.IsDirty) { item.Save(); } if (CanBeMigrated(item)) { OutputWindow.WriteLine("Copying item " + itemName + " from project " + sourceName + " into project " + targetName + "..."); for (short i = 0; i < item.FileCount; i++) { if (item.IsPhysicalDirectory()) { var directoryName = item.Name; OutputWindow.WriteLine("Copying directory " + directoryName + " from project " + sourceName + " into project " + targetName + "..."); var newDirectory = targetFolder.AddFolder(directoryName); MoveProjectItems(item.ProjectItems, newDirectory, sourceName + "/" + directoryName, targetName + "/" + directoryName); OutputWindow.WriteLine("Copied directory " + directoryName + " from project " + sourceName + " into project " + targetName + "."); } else if (item.IsPhysicalFile()) { var fileName = item.FileNames[i]; OutputWindow.WriteLine("Copying file " + fileName + " from project " + sourceName + " into project " + targetName + "..."); targetFolder.AddFromFileCopy(fileName); OutputWindow.WriteLine("Copied file " + fileName + " from project " + sourceName + " into project " + targetName + "."); } else { OutputWindow.WriteLine("Unsupported item Kind " + item.Kind + ". This item won't be moved to the project " + targetName + "."); } } itemsToDeleteFromSource.Add(item); OutputWindow.WriteLine("Copied item " + itemName + " from project " + sourceName + " into project " + targetName); } else { OutputWindow.WriteLine("Ignoring special item '" + item.Name + "'. This item cannot be migrated."); } } foreach (var item in itemsToDeleteFromSource) { var itemName = item.Name; OutputWindow.WriteLine("Deleting item '" + itemName + "' from source project..."); item.Delete(); OutputWindow.WriteLine("Deleted item '" + itemName + "' from source project."); } }