private void Copy(Configuration.CopyInfo copyInfo, FileInfo sourceFileInfo, string destinationDirectory)
        {
            string sourceFile      = sourceFileInfo.FullName;
            string destinationFile = Path.Combine(destinationDirectory, sourceFileInfo.Name);

            FileInfo destinationFileInfo = new FileInfo(destinationFile);

            // determine copying mode
            if (copyInfo.mode == Configuration.CopyInfoMode.CopyAlways)
            {
                destinationFileInfo.Attributes = FileAttributes.Archive;
            }
            else if (copyInfo.mode == Configuration.CopyInfoMode.CopyIfNewer)
            {
                if (File.Exists(destinationFile))
                {
                    if (IsEqual(sourceFileInfo, destinationFileInfo))
                    {
                        return;
                    }

                    destinationFileInfo.Attributes = FileAttributes.Archive;
                }
            }
            else
            {
                throw new CodeGeneratorException(ErrorCode.InvalidCopyMode);
            }

            // copy and synchronize file attributes
            File.Copy(sourceFile, destinationFile, true);
            destinationFileInfo.Attributes = sourceFileInfo.Attributes;
        }
        private void Copy(Configuration.CopyInfo copyInfo)
        {
            // source
            string sourceDirectory = GetSourceDirectory(copyInfo, true);
            string sourcePattern   = GetSourcePattern(copyInfo, true);

            // target
            string targetDirectory = Path.Combine(_configuration.TargetRoot, copyInfo.target);

            targetDirectory = Replacer.Replace(_configuration.ProjectReplaceInfos, targetDirectory);

            // ensure target directory
            if (!Directory.Exists(targetDirectory))
            {
                Directory.CreateDirectory(targetDirectory);
            }

            // copy
            DirectoryInfo directoryInfo = new DirectoryInfo(sourceDirectory);

            FileSystemInfo[] fileSysInfos = directoryInfo.GetFileSystemInfos(sourcePattern);

            for (int i = 0; i < fileSysInfos.Length; i++)
            {
                FileInfo fileInfo = fileSysInfos[i] as FileInfo;

                if (fileInfo != null)
                {
                    Copy(copyInfo, fileInfo, targetDirectory);
                }
                else
                {
                    if (copyInfo.recursive)
                    {
                        // source
                        string sourceDirectoryRecursive = GetSourceDirectory(copyInfo, false);
                        string sourcePatternRecursive   = GetSourcePattern(copyInfo, false);

                        // target
                        string targetRecursive = Replacer.Replace(_configuration.ProjectReplaceInfos, copyInfo.target);

                        DirectoryInfo directoryInfoRecursive = fileSysInfos[i] as DirectoryInfo;

                        // prepate for recursion
                        Configuration.CopyInfo copyInfoRecursive = new Configuration.CopyInfo();

                        copyInfoRecursive.mode      = copyInfo.mode;
                        copyInfoRecursive.recursive = copyInfo.recursive;
                        copyInfoRecursive.source    = Path.Combine(sourceDirectoryRecursive, directoryInfoRecursive.Name) + "\\" + sourcePatternRecursive;
                        copyInfoRecursive.target    = Path.Combine(targetRecursive, directoryInfoRecursive.Name);

                        // recursion
                        Copy(copyInfoRecursive);
                    }
                }
            }
        }
        private string GetSourcePattern(Configuration.CopyInfo copyInfo, bool combine)
        {
            string source = (combine) ? Path.Combine(_configuration.TemplateRoot, copyInfo.source) : copyInfo.source;
            int    index  = source.LastIndexOf('\\');

            if (index == -1)
            {
                return(source);
            }
            else
            {
                return(source.Substring(index + 1, source.Length - index - 1));
            }
        }
        private string GetSourceDirectory(Configuration.CopyInfo copyInfo, bool combine)
        {
            string source = (combine) ? Path.Combine(_configuration.TemplateRoot, copyInfo.source) : copyInfo.source;
            int    index  = source.LastIndexOf('\\');

            if (index == -1)
            {
                return(@".\");
            }
            else
            {
                return(source.Substring(0, index));
            }
        }