Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Visual Studio 2010解决方案中的项目不可用_C#_Php_Visual Studio 2010_Console Application - Fatal编程技术网

C# Visual Studio 2010解决方案中的项目不可用

C# Visual Studio 2010解决方案中的项目不可用,c#,php,visual-studio-2010,console-application,C#,Php,Visual Studio 2010,Console Application,我创建了下面的工具,以使用非Microsoft版本控制中的现有项目文件夹创建VS2010解决方案。当代码运行时,您可以告诉它代码所在的文件夹、解决方案需要转到的文件夹,然后接受要在所选文件夹中创建的解决方案名称 它正常工作了一段时间,直到我做了一些修改,允许在同一个解决方案中有多个项目,但现在它坏了 没有抛出错误消息,因此我很难确定这次的问题是什么 using System; using System.Collections.Generic; using System.Linq; using

我创建了下面的工具,以使用非Microsoft版本控制中的现有项目文件夹创建VS2010解决方案。当代码运行时,您可以告诉它代码所在的文件夹、解决方案需要转到的文件夹,然后接受要在所选文件夹中创建的解决方案名称

它正常工作了一段时间,直到我做了一些修改,允许在同一个解决方案中有多个项目,但现在它坏了

没有抛出错误消息,因此我很难确定这次的问题是什么

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Diagnostics;
using System.Windows.Forms;

namespace solutionBuilderNS {

  class Program {

    private static StreamWriter m_writeText;

    [STAThread]
    static void Main(string[] args) {
      string solutionName = null;;
      var properties = Properties.Settings.Default;
      string dataSource = properties.lastFolder;
      string solutionDir = properties.localDir;
      if ((args != null) && (0 < args.Length)) {
        solutionName = args[0];
        if (1 < args.Length) {
          dataSource = args[1];
          if (2 < args.Length) {
            solutionDir = args[2];
          }
        }
      }
      string message = 
        "This will create a Visual Studio Solution.\r\n\r\n" +
        "If you need to save the old file first, do so now.\r\n\r\n" +
        "Are you ready to begin?";
      if (MessageBox.Show(message, "Create Solution " + solutionName, MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes) {
        using (var dlg = new FolderBrowserDialog()) {
          dlg.SelectedPath = dataSource;
          dlg.Description = string.Format("Specify Physical Location of Files:\r\n{0}", dataSource);
          if (dlg.ShowDialog() == DialogResult.OK) {
            dataSource = dlg.SelectedPath;
          } else {
            dataSource = null;
          }
        }
      }
      if (!String.IsNullOrEmpty(dataSource)) {
        using (var dlg = new FolderBrowserDialog()) {
          dlg.SelectedPath = solutionDir;
          dlg.Description = string.Format("Specify Folder to Create Solution in:\r\n{0}", solutionDir);
          if (dlg.ShowDialog() == DialogResult.OK) {
            bool buildSlnName = (args != null) && !String.IsNullOrEmpty(args[0]);
            if (buildSlnName) {
              if (MessageBox.Show(String.Format("Call Solution '{0}'?", args[0]),
                "Solution Name",
                MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.Yes) {
                  buildSlnName = false;
                  solutionName = args[0];
              }
            }
            if (buildSlnName) {
              solutionDir = dlg.SelectedPath;
              var dir = new DirectoryInfo(solutionDir);
              solutionName = String.Format("{0}_{1}.sln", dir.Parent.Name, dir.Name);
            }
            if (solutionName.IndexOf(".sln") == -1) {
              solutionName += ".sln";
            }
          } else {
            solutionDir = null;
          }
        }
      }
      if (!String.IsNullOrEmpty(dataSource)) {
        properties.lastFolder = dataSource;
      }
      if (!String.IsNullOrEmpty(solutionDir)) {
        properties.localDir = solutionDir;
      }
      properties.Save();
      if (!String.IsNullOrEmpty(solutionDir)) {
        var logfilePath = Path.Combine(solutionDir, "logfile.txt");
        if (File.Exists(logfilePath)) {
          File.Delete(logfilePath);
        }
        var logfile = new FileInfo(logfilePath);
        using (m_writeText = logfile.AppendText()) {
          var item = new SolutionBuilder(solutionDir, dataSource);
          var startTime = DateTime.Now;
          Program.WriteLine("Solution {0} started at {1:g}", item.Name, startTime);
          item.Generate(solutionName);
          Program.WriteLine("Solution {0} created ({1})\r\n", item.Name, DateTime.Now - startTime);
          item.Start();
          if (item.ErrorsExist) {
            var sb = new StringBuilder("The following errors were encountered:\r\n");
            foreach (var error in item.ErrorArray) {
              sb.AppendLine("  " + error);
            }
            MessageBox.Show(sb.ToString(), "Handled Errors (skipped)");
          }
          m_writeText.Flush();
          m_writeText.Close();
        }
        Console.WriteLine("Done.\r\nPress any key to close.");
        Console.ReadKey();
      }
    }

    public static void WriteLine(string text, params object[] args) {
      string created = string.Format(text, args);
      m_writeText.WriteLine(created);
    }

  }

  public class SolutionBuilder {

    #region ' CONSTANTS '
    private const string SOLUTION_HEAD = "\r\nMicrosoft Visual Studio Solution File, Format Version 11.00\r\n# Visual Studio 2010\r\n";
    private const string FMT_PLATFORMS =
      "    {0}.Debug|x86.ActiveCfg = Debug|x86\r\n" +
      "    {0}.Debug|x86.Build.0 = Debug|x86\r\n" +
      "    {0}.Release|x86.ActiveCfg = Release|x86\r\n" +
      "    {0}.Release|x86.Build.0 = Release|x86";
    private const string FMT_GLOB_SEC = 
      "Global\r\n" +
        "  GlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n" +
      "    Debug|x86 = Debug|x86\r\n" +
          "    Release|x86 = Release|x86\r\n" +
        "  EndGlobalSection\r\n" +
        "  GlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n" +
      "{0}" +
        "  EndGlobalSection\r\n" +
        "  GlobalSection(SolutionProperties) = preSolution\r\n" +
          "    HideSolutionNode = FALSE\r\n" +
        "  EndGlobalSection\r\n" +
      "EndGlobal";
    #endregion

    private string m_solution;
    private List<string> m_errors;
    private DirectoryInfo m_rootDir, m_network;

    public SolutionBuilder(string rootDir, string networkDir) {
      m_errors = new List<string>();
      m_rootDir = new DirectoryInfo(rootDir);
      m_network = new DirectoryInfo(networkDir);
    }

    public string Name { get { return m_solution; } }

    public string[] ErrorArray {
      get { return m_errors.ToArray(); }
    }

    public bool ErrorsExist {
      get { return (0 < m_errors.Count); }
    }

    public void Generate(string solutionName) {
      m_solution = solutionName;
      if (m_rootDir.Exists) {
        var body = new StringBuilder(SOLUTION_HEAD);
        var fullSolutionName = Path.Combine(m_rootDir.FullName, Name);
        if (File.Exists(fullSolutionName)) {
          Program.WriteLine("Creating backup of Solution {0}...", fullSolutionName);
          var refBackup = fullSolutionName.Replace('.', '_') + ".old";
          if (File.Exists(refBackup)) {
            File.Delete(refBackup);
          }
          File.Move(fullSolutionName, refBackup);
          File.Delete(fullSolutionName);
        }
        var projects = new List<Project>();
        foreach (var subnet in m_network.GetDirectories()) {
          Program.WriteLine(String.Empty);
          var item = new Project(subnet.Name, m_rootDir.FullName);
          item.Generate(Name, subnet.FullName);
          if (item.ErrorsExist) {
            m_errors.AddRange(item.ErrorArray);
          }
          projects.Add(item);
        }
        Program.WriteLine(String.Empty);
        var globalSection = new StringBuilder();
        foreach (var item in projects) {
          var projLine = item.SolutionEntry;
          if (!String.IsNullOrEmpty(projLine)) {
            body.AppendLine(projLine);
            globalSection.AppendLine(string.Format(FMT_PLATFORMS, item.Guid));
          }
        }
        body.AppendLine(string.Format(FMT_GLOB_SEC, globalSection.ToString()));
        var file = new FileInfo(Path.Combine(m_rootDir.FullName, solutionName));
        using (var sw = file.AppendText()) {
          Program.WriteLine("Saving Solution {0}...", Name);
          sw.Write(body.ToString());
          sw.Flush();
          sw.Close();
        }
      }
    }

    public void Start() {
      var path = Path.Combine(m_rootDir.FullName, m_solution);
      Program.WriteLine("Launching Solution {0}...", Name);
      Process.Start(path);
    }

  }

  public class Project : IComparable<Project>, IEquatable<Project> {

    #region ' CONSTANTS '
    private const string FMT_FOLDER_INCLUDE = "    <Folder Include=\"{0}\" />";
    private const string FMT_CONTENT_INCLUDE =
      "    <Content Include=\"{0}\" >\r\n" +
      "      <Link>{1}</Link>\r\n" +
      "    </Content>";
    private const string FMT_COMPILE_INCLUDE =
      "    <Compile Include=\"{0}\" />\r\n";
    private const string FMT_COMPILE_INCLUDE_2 =
      "    <Compile Include=\"{0}\" >\r\n" +
      "      <DependentUpon>{1}</DependentUpon>\r\n" +
      "    </Compile>";
    private const string FMT_PROJ_HEAD =
      "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n" +
      "<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n" +
      "  <PropertyGroup>\r\n" +
      "    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n" +
      "    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n" +
      "    <ProductVersion>1.0.0.0</ProductVersion>\r\n" +
      "    <SchemaVersion>2.0</SchemaVersion>\r\n" +
      "    <ProjectGuid>{0}</ProjectGuid>\r\n" +
      "    <OutputType>Library</OutputType>\r\n" +
      "    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n" +
      "    <RootNamespace>{1}_NS</RootNamespace>\r\n" +
      "    <AssemblyName>{1}_ASS</AssemblyName>\r\n" +
      "    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>\r\n" +
      "    <UseIISExpress>false</UseIISExpress>\r\n" +
      "    <TargetFrameworkProfile />\r\n" +
      "  </PropertyGroup>\r\n" +
      "  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n" +
      "    <DebugSymbols>true</DebugSymbols>\r\n" +
      "    <DebugType>full</DebugType>\r\n" +
      "    <Optimize>false</Optimize>\r\n" +
      "    <OutputPath>bin\\Debug\\</OutputPath>\r\n" +
      "    <DefineConstants>TRACE;DEBUG</DefineConstants>\r\n" +
      "    <ErrorReport>prompt</ErrorReport>\r\n" +
      "    <WarningLevel>4</WarningLevel>\r\n" +
      "    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\r\n" +
      "  </PropertyGroup>\r\n" +
      "  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n" +
      "    <DebugType>pdbonly</DebugType>\r\n" +
      "    <Optimize>true</Optimize>\r\n" +
      "    <OutputPath>bin\\Release\\</OutputPath>\r\n" +
      "    <DefineConstants>TRACE</DefineConstants>\r\n" +
      "    <ErrorReport>prompt</ErrorReport>\r\n" +
      "    <WarningLevel>4</WarningLevel>\r\n" +
      "    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\r\n" +
      "  </PropertyGroup>\r\n" +
      "  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|x86' \">\r\n" +
      "    <DebugSymbols>true</DebugSymbols>\r\n" +
      "    <OutputPath>bin\\Debug\\</OutputPath>\r\n" +
      "    <DefineConstants>TRACE;DEBUG</DefineConstants>\r\n" +
      "    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\r\n" +
      "    <DebugType>full</DebugType>\r\n" +
      "    <PlatformTarget>x86</PlatformTarget>\r\n" +
      "    <ErrorReport>prompt</ErrorReport>\r\n" +
      "    <UseVSHostingProcess>true</UseVSHostingProcess>\r\n" +
      "  </PropertyGroup>\r\n" +
      "  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|x86' \">\r\n" +
      "    <OutputPath>bin\\Release\\</OutputPath>\r\n" +
      "    <DefineConstants>TRACE</DefineConstants>\r\n" +
      "    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>\r\n" +
      "    <Optimize>true</Optimize>\r\n" +
      "    <DebugType>full</DebugType>\r\n" +
      "    <PlatformTarget>x86</PlatformTarget>\r\n" +
      "    <ErrorReport>prompt</ErrorReport>\r\n" +
      "    <DebugSymbols>true</DebugSymbols>\r\n" +
      "  </PropertyGroup>\r\n" +
      "  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|x64' \">\r\n" +
      "    <DebugSymbols>true</DebugSymbols>\r\n" +
      "    <OutputPath>bin\\Debug\\</OutputPath>\r\n" +
      "    <DefineConstants>TRACE;DEBUG</DefineConstants>\r\n" +
      "    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\r\n" +
      "    <DebugType>full</DebugType>\r\n" +
      "    <PlatformTarget>x64</PlatformTarget>\r\n" +
      "    <ErrorReport>prompt</ErrorReport>\r\n" +
      "  </PropertyGroup>\r\n" +
      "  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|x64' \">\r\n" +
      "    <OutputPath>bin\\Release\\</OutputPath>\r\n" +
      "    <DefineConstants>TRACE</DefineConstants>\r\n" +
      "    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\r\n" +
      "    <Optimize>true</Optimize>\r\n" +
      "    <DebugType>pdbonly</DebugType>\r\n" +
      "    <PlatformTarget>x64</PlatformTarget>\r\n" +
      "    <ErrorReport>prompt</ErrorReport>\r\n" +
      "  </PropertyGroup>\r\n" +
      "  <ItemGroup>\r\n" +
      "    <Reference Include=\"System\" />\r\n" +
      "    <Reference Include=\"System.Configuration\" />\r\n" +
      "    <Reference Include=\"System.Core\" />\r\n" +
      "    <Reference Include=\"System.Data\" />\r\n" +
      "    <Reference Include=\"System.Data.DataSetExtensions\" />\r\n" +
      "    <Reference Include=\"System.Drawing\" />\r\n" +
      "    <Reference Include=\"System.EnterpriseServices\" />\r\n" +
      "    <Reference Include=\"System.Web\" />\r\n" +
      "    <Reference Include=\"System.Web.Extensions\" />\r\n" +
      "    <Reference Include=\"System.Web.Mobile\" />\r\n" +
      "    <Reference Include=\"System.Web.Services\" />\r\n" +
      "    <Reference Include=\"System.Xml\" />\r\n" +
      "    <Reference Include=\"System.Xml.Linq\" />\r\n" +
      "  </ItemGroup>";
    private const string PROJ_FOOT =
      "  <Import Project=\"$(MSBuildBinPath)\\Microsoft.CSharp.targets\" />\r\n" +
      "  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v10.0\\WebApplications\\Microsoft.WebApplication.targets\" />\r\n" +
      "  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r\n" +
      "      Other similar extension points exist, see Microsoft.Common.targets.\r\n" +
      "    <Target Name=\"BeforeBuild\"></Target>\r\n" +
      "    <Target Name=\"AfterBuild\"></Target>\r\n" +
      "  -->\r\n</Project>";
    #endregion

    private static string FORBIDDEN;
    private static string[] CODEFILES, LC_EXCLUDES, WEBFILES;
    private int m_trimLeft;
    private string m_guid, m_projName, m_folder;
    private List<string> m_compiles, m_contents, m_errors, m_folders;
    private DirectoryInfo m_network;
    private VsProjectType m_projType, m_fileType;
    public enum CodeTypes { CPP = 0, CS = 1, VB = 2 }
    public enum WebTypes { ASP, ASPX, HTML }

    static Project() {
      CODEFILES = new string[] { ".cpp", ".cs", ".vb" };
      LC_EXCLUDES = new string[] { ".svn", "desktop.ini", "thumbs.db" };
      WEBFILES = new string[] { ".asp", ".aspx", ".html" };
      FORBIDDEN = "~`!@#$%^&*()+|\\\"<>?/";
    }

    public Project(string name, string folder) {
      m_projType = VsProjectType.Unknown;
      m_fileType = VsProjectType.Unknown;
      m_projName = name;
      m_folder = Path.Combine(folder, name);
      m_guid = "{" + System.Guid.NewGuid().ToString().ToUpper() + "}";
      m_compiles = new List<string>();
      m_contents = new List<string>();
      m_errors = new List<string>();
      m_folders = new List<string>();
      Program.WriteLine("Project {0} started.", Name);
    }

    public string Guid { get { return m_guid; } }

    public string[] ErrorArray {
      get { return m_errors.ToArray(); }
    }

    public bool ErrorsExist {
      get { return (0 < m_errors.Count); }
    }

    public void Generate(string solution, string network) {
      Program.WriteLine("Generating Project {0}...", Name);
      if (!Directory.Exists(m_folder)) {
        Directory.CreateDirectory(m_folder);
      }
      m_network = new DirectoryInfo(network);
      m_trimLeft = m_network.FullName.Length + 1;
      Map(m_network);
      if ((m_projType != VsProjectType.Unknown) && (m_fileType != VsProjectType.Unknown)) {
        var path = Path.Combine(m_folder, Name) + GuidAssist.ProjectExtension(m_fileType);
        var file = new FileInfo(path);
        Program.WriteLine("Project File: {0}", file.FullName);
        if (file.Exists) {
          var refBackup = Path.Combine(m_folder, string.Format("{0}.old", Name.Replace('.', '_')));
          try {
            if (File.Exists(refBackup)) {
              File.Delete(refBackup);
            }
            file.MoveTo(refBackup);
          } catch (Exception err) {
            m_errors.Add(string.Format("Delete {0} Error: {1}", refBackup, err.Message));
          }
          file = new FileInfo(path);
        }
        var list = new List<string>();
        list.Add(string.Format(FMT_PROJ_HEAD, Guid, solution));
        if (0 < m_folders.Count) {
          m_folders.Sort();
          list.Add("  <ItemGroup>");
          list.AddRange(m_folders.ToArray());
          list.Add("  </ItemGroup>");
        }
        if (0 < m_contents.Count) {
          m_contents.Sort();
          list.Add("  <ItemGroup>");
          list.AddRange(m_contents.ToArray());
          list.Add("  </ItemGroup>");
        }
        if (0 < m_compiles.Count) {
          m_compiles.Sort();
          list.Add("  <ItemGroup>");
          list.AddRange(m_compiles.ToArray());
          list.Add("  </ItemGroup>");
        }
        list.Add(PROJ_FOOT);
        using (var sw = file.AppendText()) {
          Program.WriteLine("Writing Project {0}", Name);
          foreach (var line in list) {
            sw.WriteLine(line);
          }
          sw.Flush();
          sw.Close();
        }
      } else {
        Program.WriteLine("Project {0} SKIPPED! (Proj={1}; Files={2})", Name, m_projType, m_fileType);
      }
    }

    private void Map(DirectoryInfo dir) {
      Program.WriteLine("  mapping {0}...", dir.FullName);
      var netFullName = dir.FullName;
      bool isRoot = (dir == m_network);
      var relativeDir = !isRoot ? netFullName.Substring(m_trimLeft) : null;
      var subs = dir.GetDirectories();
      if (!isRoot) {
        var physicalDir = Path.Combine(m_folder, relativeDir);
        if (!Directory.Exists(physicalDir)) {
          Directory.CreateDirectory(physicalDir);
        }
        var folder = string.Format(FMT_FOLDER_INCLUDE, relativeDir);
        m_folders.Add(folder);
      }
      for (int i = 0; i < subs.Length; i++) {
        DirectoryInfo sub = null;
        try {
          sub = subs[i];
          if (!LC_EXCLUDES.Contains(sub.Name.ToLower()) && !Offensive(sub.Name)) {
            Map(sub);
          }
        } catch (Exception err) {
          m_errors.Add(string.Format("{0}: {1}", err.GetType(), err.Message));
        }
      }
      if (!isRoot) {
        var files = dir.GetFiles();
        var compiles = new List<string>();
        var contents = new List<string>();
        for (int i = 0; i < files.Length; i++) {
          FileInfo file = null;
          try {
            file = files[i];
            var name = file.Name.ToLower();
            if (!LC_EXCLUDES.Contains(name) && !Offensive(name)) {
              var ext = file.Extension.ToLower();
              if ((m_fileType == VsProjectType.Unknown) || (m_projType == VsProjectType.Unknown)) {
                if (WEBFILES.Contains(ext) && (m_projType == VsProjectType.Unknown)) {
                  m_projType = VsProjectType.WebSite;
                }
                if (ext == CODEFILES[(int)CodeTypes.CPP]) {
                  m_fileType = VsProjectType.WindowsCpp;
                } else if (ext == CODEFILES[(int)CodeTypes.CS]) {
                  m_fileType = VsProjectType.WindowsCs;
                } else if (ext == ".php") {
                  m_fileType = VsProjectType.PHP;
                  m_projType = VsProjectType.WebApplication;
                } else if (ext == CODEFILES[(int)CodeTypes.VB]) {
                  m_fileType = VsProjectType.WindowsVb;
                }
              }
              if (((m_fileType == VsProjectType.WindowsCs) || (m_fileType == VsProjectType.WindowsVb)) &&
                ((m_projType == VsProjectType.WebSite) || (m_projType == VsProjectType.Unknown))) {
                  m_projType = VsProjectType.WebApplication;
              }
              var link = Path.Combine(relativeDir, file.Name);
              if (CODEFILES.Contains(ext)) {
                compiles.Add(link);
              } else {
                contents.Add(link);
              }
            }
          } catch (Exception err) {
            m_errors.Add(string.Format("{0}: {1}", err.GetType(), err.Message));
          }
        }
        compiles.Sort();
        contents.Sort();
        foreach (var link in contents) {
          m_contents.Add(string.Format(FMT_CONTENT_INCLUDE, link, link));
        }
        foreach (var link in compiles) {
          try {
            var value = contents.First(item => (-1 < link.IndexOf(item)));
            if (!String.IsNullOrEmpty(value)) {
              m_compiles.Add(string.Format(FMT_COMPILE_INCLUDE_2, link, value));
            } else {
              m_compiles.Add(string.Format(FMT_COMPILE_INCLUDE, link));
            }
          } catch (Exception) {
            m_compiles.Add(string.Format(FMT_COMPILE_INCLUDE, link));
          }
        }
      }
    }

    public string Name { get { return m_projName; } }

    private bool Offensive(string name) {
      if (!String.IsNullOrEmpty(name)) {
        foreach (char c in name) {
          if (-1 < FORBIDDEN.IndexOf(c)) {
            return true;
          }
        }
        return false;
      }
      return true;
    }

    public string SolutionEntry {
      get {
        if ((m_projType != VsProjectType.Unknown) && (m_fileType != VsProjectType.Unknown)) {
          return string.Format("Project(\"{0}\") = \"{1}\", \"{1}\\{1}{2}\", \"{3}\"\r\nEndProject",
            GuidAssist.ProjectGuid(m_projType), Name, GuidAssist.ProjectExtension(m_fileType), Guid);
        }
        return null;
      }
    }

    public int CompareTo(Project other) {
      return Guid.CompareTo(other.Guid);
    }

    public bool Equals(Project other) {
      return Guid.Equals(other.Guid);
    }

  }

  public enum VsProjectType {
    WindowsCs, WindowsVb, WindowsCpp,
    WebApplication, WebSite,
    DistributedSystem, WCF, WPF,
    VisualDbTools, Db, DbOther,
    Test,
    LegacySmartDeviceCs, LegacySmartDeviceVb,
    SmartDeviceCs, SmartDeviceVb,
    WorkflowCs, WorkflowVb,
    DeploymentMergeMod, DeploymentCab, DeploymentSetup, DeploymentSmartDeviceCab,
    VsToolsForApps, VsToolsForOffice,
    SharePointWorkflow,
    XnaWindows, XnaZbox, ZnaZune,
    SharePointVb, SharePointCs,
    Silverlight,
    AspNetMvc1, AspNetMvc2, AspNetMvc3, AspNetMvc4,
    Extensibility,
    PHP,
    Unknown=-1
  }

  public class GuidAssist {

    private static List<string> m_guidList;

    static GuidAssist() {
      m_guidList = new List<string>();
      m_guidList.AddRange(new string[] {
        "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}", "{F184B08F-C81C-45F6-A57F-5ABD9991F28F}", "{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}",
        "{349C5851-65DF-11DA-9384-00065B846F21}", "{E24C65DC-7377-472B-9ABA-BC803B73C61A}",
        "{F135691A-BF7E-435D-8960-F99683D2D49C}", "{3D9AD99F-2412-4246-B90B-4EAA41C64699}", "{60DC8134-EBA5-43B8-BCC9-BB4BC16C2548}",
        "{C252FEB5-A946-4202-B1D4-9916A0590387}", "{A9ACE9BB-CECE-4E62-9AA4-C7E7C5BD2124}", "{4F174C21-8C12-11D0-8340-0000F80270F8}",
        "{3AC096D0-A1C2-E12C-1390-A8335801FDAB}",
        "{20D4826A-C6FA-45DB-90F4-C717570B9F32}", "{CB4CE8C6-1BDB-4DC7-A4D3-65A1999772F8}",
        "{4D628B5B-2FBC-4AA6-8C16-197242AEB884}", "{68B1623D-7FB9-47D8-8664-7ECEA3297D4F}",
        "{14822709-B5A1-4724-98CA-57A101D1B079}", "{D59BE175-2ED0-4C54-BE3D-CDAA9F3214C8}",
        "{06A35CCD-C46D-44D5-987B-CF40FF872267}", "{3EA9E505-35AC-4774-B492-AD1749C4943A}", "{978C614F-708E-4E1A-B201-565925725DBA}", "{AB322303-2255-48EF-A496-5904EB18DA55}",
        "{A860303F-1F3F-4691-B57E-529FC101A107}", "{BAA0C2D2-18E2-41B9-852F-F413020CAA33}",
        "{F8810EC1-6754-47FC-A15F-DFABD2E3FA90}",
        "{6D335F3A-9D43-41b4-9D22-F6F17C4BE596}", "{2DF5C3F4-5A5F-47a9-8E94-23B4456F55E2}", "{D399B71A-8929-442a-A9AC-8BEC78BB2433}",
        "{EC05E597-79D4-47f3-ADA0-324C4F7C7484}", "{593B0543-81F6-4436-BA1E-4747859CAAE2}",
        "{A1591282-1198-4647-A2B1-27E5FF5F6F3B}",
        "{603C0E0B-DB56-11DC-BE95-000D561079B0}", "{F85E285D-A4E0-4152-9332-AB1D724D3325}", "{E53F8FEA-EAE0-44A6-8774-FFD645390401}", "{E3E379DF-F4C6-4180-9B81-6769533ABE47}",
        "{82B43B9B-A64C-4715-B499-D71E9CA2BD60}",
        "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}",
        "-1"
      });
    }

    public static string ProjectGuid(VsProjectType projectType) {
      return m_guidList[(int)projectType];
    }

    public static string ProjectExtension(VsProjectType projectType) {
      switch (projectType) {
        case VsProjectType.LegacySmartDeviceCs:
        case VsProjectType.SharePointCs:
        case VsProjectType.SmartDeviceCs:
        case VsProjectType.WindowsCs:
        case VsProjectType.WorkflowCs:
          return ".csproj";
        case VsProjectType.LegacySmartDeviceVb:
        case VsProjectType.SharePointVb:
        case VsProjectType.SmartDeviceVb:
        case VsProjectType.WindowsVb:
        case VsProjectType.WorkflowVb:
          return ".vbproj";
        case VsProjectType.WindowsCpp:
          return ".cppproj";
        case VsProjectType.PHP:
          return ".phpproj";
        default:
          return ".proj";
      }
    }

  }

}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.IO;
使用系统诊断;
使用System.Windows.Forms;
命名空间解决方案构建器{
班级计划{
私有静态StreamWriter m_writeText;
[状态线程]
静态void Main(字符串[]参数){
字符串solutionName=null;;
var properties=properties.Settings.Default;
字符串dataSource=properties.lastFolder;
字符串solutionDir=properties.localDir;
如果((args!=null)和((0using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Diagnostics;
using System.Windows.Forms;

namespace spiderBuilderNS {

  class Program {

    private static StreamWriter m_writeText;
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main(string[] args) {
      string solnName = null; // "spider_e_www_iis.sln";
      var properties = Properties.Settings.Default;
      string dataDir = properties.lastFolder;
      string solnDir = properties.localDir;
      if ((args != null) && (0 < args.Length)) {
        solnName = args[0];
        if (1 < args.Length) {
          dataDir = args[1];
          if (2 < args.Length) {
            solnDir = args[2];
          }
        }
      }
      string message = 
        "This will create a Visual Studio Solution.\r\n\r\n" +
        "If you need to save the old file first, do so now.\r\n\r\n" +
        "Are you ready to begin?";
      if (MessageBox.Show(message, "Create Solution " + solnName, MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes) {
        using (var dlg = new FolderBrowserDialog()) {
          dlg.SelectedPath = dataDir;
          dlg.Description = string.Format("Specify Physical Location of Files:\r\n{0}", dataDir);
          if (dlg.ShowDialog() == DialogResult.OK) {
            dataDir = dlg.SelectedPath;
          } else {
            dataDir = null;
          }
        }
      }
      if (!String.IsNullOrEmpty(dataDir)) {
        using (var dlg = new FolderBrowserDialog()) {
          dlg.SelectedPath = solnDir;
          dlg.Description = string.Format("Specify Folder to Create Solution in:\r\n{0}", solnDir);
          if (dlg.ShowDialog() == DialogResult.OK) {
            bool buildSlnName = (args != null) && !String.IsNullOrEmpty(args[0]);
            if (buildSlnName) {
              if (MessageBox.Show(String.Format("Call Solution '{0}'?", args[0]),
                "Solution Name",
                MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.Yes) {
                  buildSlnName = false;
                  solnName = args[0];
              }
            }
            if (buildSlnName) {
              solnDir = dlg.SelectedPath;
              var dir = new DirectoryInfo(solnDir);
              solnName = String.Format("{0}_{1}.sln", dir.Parent.Name, dir.Name);
            }
            if (solnName.IndexOf(".sln") == -1) {
              solnName += ".sln";
            }
          } else {
            solnDir = null;
          }
        }
      }
      if (!String.IsNullOrEmpty(dataDir)) {
        properties.lastFolder = dataDir;
      }
      if (!String.IsNullOrEmpty(solnDir)) {
        properties.localDir = solnDir;
      }
      properties.Save();
      if (!String.IsNullOrEmpty(solnDir)) {
        var logfilePath = Path.Combine(solnDir, "logfile.txt");
        if (File.Exists(logfilePath)) {
          File.Delete(logfilePath);
        }
        var logfile = new FileInfo(logfilePath);
        using (m_writeText = logfile.AppendText()) {
          var item = new SolutionBuilder(solnDir, dataDir);
          var startTime = DateTime.Now;
          Program.WriteLine("Solution {0} started at {1:g}", item.Name, startTime);
          item.Generate(solnName);
          Program.WriteLine("Solution {0} created ({1})\r\n", item.Name, DateTime.Now - startTime);
          item.Start();
          if (item.ErrorsExist) {
            var sb = new StringBuilder("The following errors were encountered:\r\n");
            foreach (var error in item.ErrorArray) {
              sb.AppendLine("  " + error);
            }
            MessageBox.Show(sb.ToString(), "Handled Errors (skipped)");
          }
          m_writeText.Flush();
          m_writeText.Close();
        }
        Console.WriteLine("Done.\r\nPress any key to close.");
        Console.ReadKey();
      }
    }

    public static void WriteLine(string text, params object[] args) {
      string created = string.Format(text, args);
      m_writeText.WriteLine(created);
    }

  }

  public class SolutionBuilder {

    #region ' CONSTANTS '
    private const string SOLUTION_HEAD = "\r\nMicrosoft Visual Studio Solution File, Format Version 11.00\r\n# Visual Studio 2010\r\n";
    private const string FMT_PLATFORMS =
      "    {0}.Debug|x86.ActiveCfg = Debug|x86\r\n" +
      "    {0}.Debug|x86.Build.0 = Debug|x86\r\n" +
      "    {0}.Release|x86.ActiveCfg = Release|x86\r\n" +
      "    {0}.Release|x86.Build.0 = Release|x86";
    private const string FMT_GLOB_SEC = 
      "Global\r\n" +
        "  GlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n" +
      "    Debug|x86 = Debug|x86\r\n" +
          "    Release|x86 = Release|x86\r\n" +
        "  EndGlobalSection\r\n" +
        "  GlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n" +
      "{0}" +
        "  EndGlobalSection\r\n" +
        "  GlobalSection(SolutionProperties) = preSolution\r\n" +
          "    HideSolutionNode = FALSE\r\n" +
        "  EndGlobalSection\r\n" +
      "EndGlobal";
    #endregion

    private string m_solnName;
    private List<string> m_errors;
    private DirectoryInfo m_solnDir, m_dataDir;

    public SolutionBuilder(string solnDir, string dataDir) {
      m_errors = new List<string>();
      m_solnDir = new DirectoryInfo(solnDir);
      m_dataDir = new DirectoryInfo(dataDir);
    }

    public string Name { get { return m_solnName; } }

    public string[] ErrorArray {
      get { return m_errors.ToArray(); }
    }

    public bool ErrorsExist {
      get { return (0 < m_errors.Count); }
    }

    public void Generate(string solnName) {
      m_solnName = solnName;
      if (m_solnDir.Exists) {
        var body = new StringBuilder(SOLUTION_HEAD);
        var fullSolutionName = Path.Combine(m_solnDir.FullName, Name);
        if (File.Exists(fullSolutionName)) {
          Program.WriteLine("Creating backup of Solution {0}...", fullSolutionName);
          var refBackup = fullSolutionName.Replace('.', '_') + ".old";
          if (File.Exists(refBackup)) {
            File.Delete(refBackup);
          }
          File.Move(fullSolutionName, refBackup);
          File.Delete(fullSolutionName);
        }
        var projects = new List<Project>();
        foreach (var sub in m_dataDir.GetDirectories()) {
          Program.WriteLine(String.Empty);
          var projDir = Path.Combine(m_solnDir.FullName, sub.Name);
          var item = new Project(projDir, sub.FullName);
          item.Generate(sub.Name);
          if (item.ErrorsExist) {
            m_errors.AddRange(item.ErrorArray);
          }
          projects.Add(item);
        }
        Program.WriteLine(String.Empty);
        var globalSection = new StringBuilder();
        foreach (var item in projects) {
          var projLine = item.SolutionEntry;
          if (!String.IsNullOrEmpty(projLine)) {
            body.AppendLine(projLine);
            globalSection.AppendLine(string.Format(FMT_PLATFORMS, item.Guid));
          }
        }
        body.AppendLine(string.Format(FMT_GLOB_SEC, globalSection.ToString()));
        var file = new FileInfo(Path.Combine(m_solnDir.FullName, solnName));
        using (var sw = file.AppendText()) {
          Program.WriteLine("Saving Solution {0}...", Name);
          sw.Write(body.ToString());
          sw.Flush();
          sw.Close();
        }
      }
    }

    public void Start() {
      var path = Path.Combine(m_solnDir.FullName, m_solnName);
      Program.WriteLine("Launching Solution {0}...", Name);
      Process.Start(path);
    }

  }

  public class Project : IComparable<Project>, IEquatable<Project> {

    #region ' CONSTANTS '
    private const string FMT_FOLDER_INCLUDE =
      "    <Folder Include=\"{0}\" />";
    private const string FMT_CONTENT_INCLUDE =
      "    <Content Include=\"{0}\" >\r\n" +
      "      <Link>{1}</Link>\r\n" +
      "    </Content>";
    private const string FMT_COMPILE_INCLUDE =
      "    <Compile Include=\"{0}\" />\r\n";
    private const string FMT_COMPILE_INCLUDE_2 =
      "    <Compile Include=\"{0}\" >\r\n" +
      "      <DependentUpon>{1}</DependentUpon>\r\n" +
      "    </Compile>";
    private const string FMT_PROJ_HEAD =
      "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n" +
      "<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n" +
      "  <PropertyGroup>\r\n" +
      "    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n" +
      "    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n" +
      "    <ProductVersion>1.0.0.0</ProductVersion>\r\n" +
      "    <SchemaVersion>2.0</SchemaVersion>\r\n" +
      "    <ProjectGuid>{0}</ProjectGuid>\r\n" +
      "    <ProjectTypeGuids>{1};{2}</ProjectTypeGuids>\r\n" +
      "    <OutputType>Library</OutputType>\r\n" +
      "    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n" +
      "    <RootNamespace>{3}_NS</RootNamespace>\r\n" +
      "    <AssemblyName>{3}_ASS</AssemblyName>\r\n" +
      "    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>\r\n" +
      "    <UseIISExpress>false</UseIISExpress>\r\n" +
      "    <TargetFrameworkProfile />\r\n" +
      "  </PropertyGroup>\r\n" +
      "  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n" +
      "    <DebugSymbols>true</DebugSymbols>\r\n" +
      "    <DebugType>full</DebugType>\r\n" +
      "    <Optimize>false</Optimize>\r\n" +
      "    <OutputPath>bin\\Debug\\</OutputPath>\r\n" +
      "    <DefineConstants>TRACE;DEBUG</DefineConstants>\r\n" +
      "    <ErrorReport>prompt</ErrorReport>\r\n" +
      "    <WarningLevel>4</WarningLevel>\r\n" +
      "    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\r\n" +
      "  </PropertyGroup>\r\n" +
      "  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n" +
      "    <DebugType>pdbonly</DebugType>\r\n" +
      "    <Optimize>true</Optimize>\r\n" +
      "    <OutputPath>bin\\Release\\</OutputPath>\r\n" +
      "    <DefineConstants>TRACE</DefineConstants>\r\n" +
      "    <ErrorReport>prompt</ErrorReport>\r\n" +
      "    <WarningLevel>4</WarningLevel>\r\n" +
      "    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\r\n" +
      "  </PropertyGroup>\r\n" +
      "  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|x86' \">\r\n" +
      "    <DebugSymbols>true</DebugSymbols>\r\n" +
      "    <OutputPath>bin\\Debug\\</OutputPath>\r\n" +
      "    <DefineConstants>TRACE;DEBUG</DefineConstants>\r\n" +
      "    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\r\n" +
      "    <DebugType>full</DebugType>\r\n" +
      "    <PlatformTarget>x86</PlatformTarget>\r\n" +
      "    <ErrorReport>prompt</ErrorReport>\r\n" +
      "    <UseVSHostingProcess>true</UseVSHostingProcess>\r\n" +
      "  </PropertyGroup>\r\n" +
      "  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|x86' \">\r\n" +
      "    <OutputPath>bin\\Release\\</OutputPath>\r\n" +
      "    <DefineConstants>TRACE</DefineConstants>\r\n" +
      "    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>\r\n" +
      "    <Optimize>true</Optimize>\r\n" +
      "    <DebugType>full</DebugType>\r\n" +
      "    <PlatformTarget>x86</PlatformTarget>\r\n" +
      "    <ErrorReport>prompt</ErrorReport>\r\n" +
      "    <DebugSymbols>true</DebugSymbols>\r\n" +
      "  </PropertyGroup>\r\n" +
      "  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|x64' \">\r\n" +
      "    <DebugSymbols>true</DebugSymbols>\r\n" +
      "    <OutputPath>bin\\Debug\\</OutputPath>\r\n" +
      "    <DefineConstants>TRACE;DEBUG</DefineConstants>\r\n" +
      "    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\r\n" +
      "    <DebugType>full</DebugType>\r\n" +
      "    <PlatformTarget>x64</PlatformTarget>\r\n" +
      "    <ErrorReport>prompt</ErrorReport>\r\n" +
      "  </PropertyGroup>\r\n" +
      "  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|x64' \">\r\n" +
      "    <OutputPath>bin\\Release\\</OutputPath>\r\n" +
      "    <DefineConstants>TRACE</DefineConstants>\r\n" +
      "    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\r\n" +
      "    <Optimize>true</Optimize>\r\n" +
      "    <DebugType>pdbonly</DebugType>\r\n" +
      "    <PlatformTarget>x64</PlatformTarget>\r\n" +
      "    <ErrorReport>prompt</ErrorReport>\r\n" +
      "  </PropertyGroup>\r\n" +
      "  <ItemGroup>\r\n" +
      "    <Reference Include=\"System\" />\r\n" +
      "    <Reference Include=\"System.Configuration\" />\r\n" +
      "    <Reference Include=\"System.Core\" />\r\n" +
      "    <Reference Include=\"System.Data\" />\r\n" +
      "    <Reference Include=\"System.Data.DataSetExtensions\" />\r\n" +
      "    <Reference Include=\"System.Drawing\" />\r\n" +
      "    <Reference Include=\"System.EnterpriseServices\" />\r\n" +
      "    <Reference Include=\"System.Web\" />\r\n" +
      "    <Reference Include=\"System.Web.Extensions\" />\r\n" +
      "    <Reference Include=\"System.Web.Mobile\" />\r\n" +
      "    <Reference Include=\"System.Web.Services\" />\r\n" +
      "    <Reference Include=\"System.Xml\" />\r\n" +
      "    <Reference Include=\"System.Xml.Linq\" />\r\n" +
      "  </ItemGroup>";
    private const string FMT_PHP_HEAD =
      "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n" +
      "<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n" +
      "  <PropertyGroup>\r\n" +
      "    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n" +
      "    <Name>PHPWebProject2</Name>\r\n" +
      "    <ProjectGuid>{0}</ProjectGuid>\r\n" +
      "    <OutputType>Library</OutputType>\r\n" +
      "    <RootNamespace>PHPWebProject2</RootNamespace>\r\n" +
      "    <!-- important to be opened by PHP Tools, when also Phalanger Tools are installed -->\r\n" +
      "    <ProjectTypeGuids>{1}</ProjectTypeGuids>\r\n" +
      "    <AssemblyName>{2}</AssemblyName>\r\n" +
      "  </PropertyGroup>\r\n" +
      "  <PropertyGroup Condition=\" '$(Configuration)' == 'Debug' \">\r\n" +
      "    <IncludeDebugInformation>true</IncludeDebugInformation>\r\n" +
      "  </PropertyGroup>\r\n" +
      "  <PropertyGroup Condition=\" '$(Configuration)' == 'Release' \">\r\n" +
      "    <IncludeDebugInformation>false</IncludeDebugInformation>\r\n" +
      "  </PropertyGroup>";
    private const string ITEM_GRP_START = "  <ItemGroup>";
    private const string ITEM_GRP_STOP = "  </ItemGroup>";
    private const string PROJ_FOOT =
      "  <Import Project=\"$(MSBuildBinPath)\\Microsoft.CSharp.targets\" />\r\n" +
      "  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v10.0\\WebApplications\\Microsoft.WebApplication.targets\" />\r\n" +
      "  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r\n" +
      "      Other similar extension points exist, see Microsoft.Common.targets.\r\n" +
      "    <Target Name=\"BeforeBuild\"></Target>\r\n" +
      "    <Target Name=\"AfterBuild\"></Target>\r\n" +
      "  -->\r\n</Project>";
    private const string PHP_FOOT = "</Project>";
    private const string PHPTOOLS_GUID = "{A0786B88-2ADB-4C21-ABE8-AA2D79766269}";
    #endregion

    private static string FORBIDDEN;
    private static string[] CODEFILES, LC_EXCLUDES, WEBFILES;
    private int m_trimLeft;
    private string m_guid, m_projName, m_projDir, m_dataDir;
    private List<string> m_compiles, m_contents, m_errors, m_folders;
    private VsProjectType m_projType, m_fileType;
    public enum CodeTypes { CPP = 0, CS = 1, VB = 2 }
    public enum WebTypes { ASP, ASPX, HTML }

    static Project() {
      CODEFILES = new string[] { ".cpp", ".cs", ".vb" };
      LC_EXCLUDES = new string[] { ".svn", "desktop.ini", "thumbs.db" };
      WEBFILES = new string[] { ".asp", ".aspx", ".html" };
      FORBIDDEN = "~`!@#$%^&*()+|\\\"<>?/";
    }

    public Project(string projDir, string dataDir) {
      m_projType = VsProjectType.Unknown;
      m_fileType = VsProjectType.Unknown;
      m_compiles = new List<string>();
      m_contents = new List<string>();
      m_errors = new List<string>();
      m_folders = new List<string>();
      m_projDir = projDir;
      m_dataDir = dataDir;
      m_trimLeft = dataDir.Length + 1;
      m_guid = "{" + System.Guid.NewGuid().ToString().ToUpper() + "}";
      Program.WriteLine("Project {0} started.", Name);
    }

    public string Guid { get { return m_guid; } }

    public string[] ErrorArray {
      get { return m_errors.ToArray(); }
    }

    public bool ErrorsExist {
      get { return (0 < m_errors.Count); }
    }

    public void Generate(string projName) {
      m_projName = projName;
      Program.WriteLine("Generating Project {0}...", Name);
      if (!Directory.Exists(m_projDir)) {
        Directory.CreateDirectory(m_projDir);
      }
      Map(new DirectoryInfo(m_dataDir));
      if ((m_projType != VsProjectType.Unknown) && (m_fileType != VsProjectType.Unknown)) {
        var projFullName = Path.Combine(m_projDir, Name) + GuidAssist.ProjectExtension(m_fileType);
        Program.WriteLine("Project File: {0}", projFullName);
        if (File.Exists(projFullName)) {
          var refBackup = Path.Combine(m_projDir, string.Format("{0}.old", Name.Replace('.', '_')));
          try {
            if (File.Exists(refBackup)) {
              File.Delete(refBackup);
            }
            File.Move(projFullName, refBackup);
          } catch (Exception err) {
            m_errors.Add(string.Format("Delete {0} Error: {1}", refBackup, err.Message));
          }
        }
        var list = new List<string>();
        if (m_projType != VsProjectType.PHP) {
          list.Add(string.Format(FMT_PROJ_HEAD, Guid, GuidAssist.ProjectGuid(m_projType), GuidAssist.ProjectGuid(m_fileType), projName)); // Non-PHP
        } else {
          list.Add(string.Format(FMT_PHP_HEAD, Guid, PHPTOOLS_GUID, projName));
        }
        if (0 < m_folders.Count) {
          m_folders.Sort();
          list.Add(ITEM_GRP_START);
          foreach (var link in m_folders) {
            list.Add(string.Format(FMT_FOLDER_INCLUDE, link));
          }
          list.Add(ITEM_GRP_STOP);
        }
        if (0 < m_contents.Count) {
          m_contents.Sort();
          m_contents.Sort();
          list.Add(ITEM_GRP_START);
          foreach (var link in m_contents) {
            list.Add(string.Format(FMT_CONTENT_INCLUDE, link, link));
          }
          list.Add(ITEM_GRP_STOP);
        }
        if (0 < m_compiles.Count) {
          m_compiles.Sort();
          list.Add(ITEM_GRP_START);
          m_compiles.Sort();
          foreach (var link in m_compiles) {
            try {
              var value = m_compiles.First(item => (-1 < link.IndexOf(item)));
              if (!String.IsNullOrEmpty(value)) {
                list.Add(string.Format(FMT_COMPILE_INCLUDE_2, link, value));
              } else {
                list.Add(string.Format(FMT_COMPILE_INCLUDE, link));
              }
            } catch (Exception) {
              list.Add(string.Format(FMT_COMPILE_INCLUDE, link));
            }
          }
          list.Add(ITEM_GRP_STOP);
        }
        if (m_projType != VsProjectType.PHP) {
          list.Add(PROJ_FOOT);
        } else {
          list.Add(PHP_FOOT);
        }
        File.WriteAllLines(projFullName, list.ToArray());
      } else {
        Program.WriteLine("Project {0} was SKIPPED! (Proj={1}; Files={2})", Name, m_projType, m_fileType);
      }
    }

    private void Map(DirectoryInfo dir) {
      Program.WriteLine("  mapping {0}...", dir.FullName);
      var netFullName = dir.FullName;
      bool isRoot = (netFullName == m_dataDir);
      var relativeDir = !isRoot ? netFullName.Substring(m_trimLeft) : null;
      var subs = dir.GetDirectories();
      if (!isRoot) {
        var physicalDir = Path.Combine(m_projDir, relativeDir);
        if (!Directory.Exists(physicalDir)) {
          Directory.CreateDirectory(physicalDir);
        }
        m_folders.Add(relativeDir);
      }
      for (int i = 0; i < subs.Length; i++) {
        DirectoryInfo sub = null;
        try {
          sub = subs[i];
          if (!LC_EXCLUDES.Contains(sub.Name.ToLower()) && !Offensive(sub.Name)) {
            Map(sub);
          }
        } catch (Exception err) {
          m_errors.Add(string.Format("{0}: {1}", err.GetType(), err.Message));
        }
      }
      if (!isRoot) {
        var files = dir.GetFiles();
        for (int i = 0; i < files.Length; i++) {
          FileInfo file = null;
          try {
            file = files[i];
            var name = file.Name.ToLower();
            if (!LC_EXCLUDES.Contains(name) && !Offensive(name)) {
              var ext = file.Extension.ToLower();
              if ((m_fileType == VsProjectType.Unknown) || (m_projType == VsProjectType.Unknown)) {
                if (WEBFILES.Contains(ext) && (m_projType == VsProjectType.Unknown)) {
                  m_projType = VsProjectType.WebSite;
                }
                if (ext == CODEFILES[(int)CodeTypes.CPP]) {
                  m_fileType = VsProjectType.WindowsCpp;
                } else if (ext == CODEFILES[(int)CodeTypes.CS]) {
                  m_fileType = VsProjectType.WindowsCs;
                } else if (ext == ".php") {
                  m_fileType = VsProjectType.PHP;
                  m_projType = VsProjectType.PHP;
                } else if (ext == CODEFILES[(int)CodeTypes.VB]) {
                  m_fileType = VsProjectType.WindowsVb;
                }
              }
              if (((m_fileType == VsProjectType.WindowsCs) || (m_fileType == VsProjectType.WindowsVb)) &&
                ((m_projType == VsProjectType.WebSite) || (m_projType == VsProjectType.Unknown))) {
                  m_projType = VsProjectType.WebApplication;
              }
              var link = Path.Combine(relativeDir, file.Name);
              if (CODEFILES.Contains(ext)) {
                m_compiles.Add(link);
              } else {
                m_contents.Add(link);
              }
            }
          } catch (Exception err) {
            m_errors.Add(string.Format("{0}: {1}", err.GetType(), err.Message));
          }
        }
      }
    }

    public string Name { get { return m_projName; } }

    private bool Offensive(string name) {
      if (!String.IsNullOrEmpty(name)) {
        foreach (char c in name) {
          if (-1 < FORBIDDEN.IndexOf(c)) {
            return true;
          }
        }
        return false;
      }
      return true;
    }

    public string SolutionEntry {
      get {
        if ((m_projType != VsProjectType.Unknown) && (m_fileType != VsProjectType.Unknown)) {
          return string.Format("Project(\"{0}\") = \"{1}\", \"{1}\\{1}{2}\", \"{3}\"\r\nEndProject",
            GuidAssist.ProjectGuid(m_projType), Name, GuidAssist.ProjectExtension(m_fileType), Guid);
        }
        return null;
      }
    }

    public int CompareTo(Project other) {
      return Guid.CompareTo(other.Guid);
    }

    public bool Equals(Project other) {
      return Guid.Equals(other.Guid);
    }

  }

  public enum VsProjectType {
    WindowsCs, WindowsVb, WindowsCpp,
    WebApplication, WebSite,
    DistributedSystem, WCF, WPF,
    VisualDbTools, Db, DbOther,
    Test,
    LegacySmartDeviceCs, LegacySmartDeviceVb,
    SmartDeviceCs, SmartDeviceVb,
    WorkflowCs, WorkflowVb,
    DeploymentMergeMod, DeploymentCab, DeploymentSetup, DeploymentSmartDeviceCab,
    VsToolsForApps, VsToolsForOffice,
    SharePointWorkflow,
    XnaWindows, XnaZbox, ZnaZune,
    SharePointVb, SharePointCs,
    Silverlight,
    AspNetMvc1, AspNetMvc2, AspNetMvc3, AspNetMvc4,
    Extensibility,
    PHP,
    Unknown=-1
  }

  public class GuidAssist {

    private static List<string> m_guidList;

    static GuidAssist() {
      m_guidList = new List<string>();
      m_guidList.AddRange(new string[] {
        "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}", "{F184B08F-C81C-45F6-A57F-5ABD9991F28F}", "{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}",
        "{349C5851-65DF-11DA-9384-00065B846F21}", "{E24C65DC-7377-472B-9ABA-BC803B73C61A}",
        "{F135691A-BF7E-435D-8960-F99683D2D49C}", "{3D9AD99F-2412-4246-B90B-4EAA41C64699}", "{60DC8134-EBA5-43B8-BCC9-BB4BC16C2548}",
        "{C252FEB5-A946-4202-B1D4-9916A0590387}", "{A9ACE9BB-CECE-4E62-9AA4-C7E7C5BD2124}", "{4F174C21-8C12-11D0-8340-0000F80270F8}",
        "{3AC096D0-A1C2-E12C-1390-A8335801FDAB}",
        "{20D4826A-C6FA-45DB-90F4-C717570B9F32}", "{CB4CE8C6-1BDB-4DC7-A4D3-65A1999772F8}",
        "{4D628B5B-2FBC-4AA6-8C16-197242AEB884}", "{68B1623D-7FB9-47D8-8664-7ECEA3297D4F}",
        "{14822709-B5A1-4724-98CA-57A101D1B079}", "{D59BE175-2ED0-4C54-BE3D-CDAA9F3214C8}",
        "{06A35CCD-C46D-44D5-987B-CF40FF872267}", "{3EA9E505-35AC-4774-B492-AD1749C4943A}", "{978C614F-708E-4E1A-B201-565925725DBA}", "{AB322303-2255-48EF-A496-5904EB18DA55}",
        "{A860303F-1F3F-4691-B57E-529FC101A107}", "{BAA0C2D2-18E2-41B9-852F-F413020CAA33}",
        "{F8810EC1-6754-47FC-A15F-DFABD2E3FA90}",
        "{6D335F3A-9D43-41b4-9D22-F6F17C4BE596}", "{2DF5C3F4-5A5F-47a9-8E94-23B4456F55E2}", "{D399B71A-8929-442a-A9AC-8BEC78BB2433}",
        "{EC05E597-79D4-47f3-ADA0-324C4F7C7484}", "{593B0543-81F6-4436-BA1E-4747859CAAE2}",
        "{A1591282-1198-4647-A2B1-27E5FF5F6F3B}",
        "{603C0E0B-DB56-11DC-BE95-000D561079B0}", "{F85E285D-A4E0-4152-9332-AB1D724D3325}", "{E53F8FEA-EAE0-44A6-8774-FFD645390401}", "{E3E379DF-F4C6-4180-9B81-6769533ABE47}",
        "{82B43B9B-A64C-4715-B499-D71E9CA2BD60}",
        "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}",
        "-1"
      });
    }

    public static string ProjectGuid(VsProjectType projectType) {
      return m_guidList[(int)projectType];
    }

    public static string ProjectExtension(VsProjectType projectType) {
      switch (projectType) {
        case VsProjectType.LegacySmartDeviceCs:
        case VsProjectType.SharePointCs:
        case VsProjectType.SmartDeviceCs:
        case VsProjectType.WindowsCs:
        case VsProjectType.WorkflowCs:
          return ".csproj";
        case VsProjectType.LegacySmartDeviceVb:
        case VsProjectType.SharePointVb:
        case VsProjectType.SmartDeviceVb:
        case VsProjectType.WindowsVb:
        case VsProjectType.WorkflowVb:
          return ".vbproj";
        case VsProjectType.WindowsCpp:
          return ".cppproj";
        case VsProjectType.PHP:
          return ".phpproj";
        default:
          return ".proj";
      }
    }

  }

}