private void AddItemCopy(CopyItemContext copyItemContext, out Exception e)
        {
            e = null;
            try
            {
                switch (copyItemContext.Item.Kind)
                {
                case (Constants.vsProjectItemKindSolutionItems):
                case (Constants.vsProjectItemKindPhysicalFile):
                {
                    for (short i = 1; i <= copyItemContext.Item.FileCount; ++i)
                    {
                        var file        = copyItemContext.Item.get_FileNames(i);
                        var newFileName = copyItemContext.CopyPath;

                        if (copyItemContext.IsWithinProject)
                        {
                            copyItemContext.DestinationItems.AddFromTemplate(file, newFileName);
                        }
                        else
                        {
                            copyItemContext.DestinationItems.AddFromFileCopy(file);
                            copyItemContext.Root.LastCreatedItem.Name = newFileName;
                        }
                    }
                    break;
                }

                case (Constants.vsProjectItemKindPhysicalFolder):
                    copyItemContext.DestinationItems.AddFolder(copyItemContext.CopyPath,
                                                               Constants.vsProjectItemKindPhysicalFolder);
                    break;

                case (Constants.vsProjectItemKindVirtualFolder):
                    copyItemContext.DestinationItems.AddFolder(copyItemContext.CopyPath,
                                                               Constants.vsProjectItemKindVirtualFolder);
                    break;

                case (Constants.vsProjectItemKindSubProject):
                default:
                    break;
                }
            }
            catch (Exception ce)
            {
                e = ce;
            }

            if (!copyItemContext.Recurse || null != e)
            {
                return;
            }

            var clone = copyItemContext.Clone();

            clone.DestinationItems = copyItemContext.Root.LastCreatedItem.ProjectItems;
            foreach (ProjectItem subItem in copyItemContext.Item.ProjectItems)
            {
                clone.Item     = subItem;
                clone.CopyPath = clone.Item.Name;
                AddItemCopy(clone, out e);
            }
        }
        private void AddItemCopy(CopyItemContext copyItemContext, out Exception e)
        {
            e = null;
            try
            {
                switch (copyItemContext.Item.Kind)
                {
                    case (Constants.vsProjectItemKindSolutionItems):
                    case (Constants.vsProjectItemKindPhysicalFile):
                        {
                            for (short i = 1; i <= copyItemContext.Item.FileCount; ++i)
                            {
                                var file = copyItemContext.Item.get_FileNames(i);
                                var newFileName = copyItemContext.CopyPath;

                                if (copyItemContext.IsWithinProject)
                                {
                                    copyItemContext.DestinationItems.AddFromTemplate(file, newFileName);
                                }
                                else
                                {
                                    copyItemContext.DestinationItems.AddFromFileCopy(file);
                                    copyItemContext.Root.LastCreatedItem.Name = newFileName;
                                }
                            }
                            break;
                        }
                    case (Constants.vsProjectItemKindPhysicalFolder):
                        copyItemContext.DestinationItems.AddFolder(copyItemContext.CopyPath,
                                                                   Constants.vsProjectItemKindPhysicalFolder);
                        break;
                    case (Constants.vsProjectItemKindVirtualFolder):
                        copyItemContext.DestinationItems.AddFolder(copyItemContext.CopyPath,
                                                                   Constants.vsProjectItemKindVirtualFolder);
                        break;
                    case (Constants.vsProjectItemKindSubProject):
                    default:
                        break;
                }
            }
            catch (Exception ce)
            {
                e = ce;
            }

            if (!copyItemContext.Recurse || null != e)
            {
                return;
            }

            var clone = copyItemContext.Clone();
            clone.DestinationItems = copyItemContext.Root.LastCreatedItem.ProjectItems;
            foreach (ProjectItem subItem in copyItemContext.Item.ProjectItems)
            {
                clone.Item = subItem;
                clone.CopyPath = clone.Item.Name;
                AddItemCopy(clone, out e);
            }
        }