using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using QiHe.CodeLib;
using QiHe.CodeLib.Compress;
using Microsoft.Build.BuildEngine;
namespace QiHe.ProjectTool
{
public class ProjectFile
{
public static List<string> LoadProjectList(string path)
{
List<string> projects = new List<string>();
DirectoryInfo dir = new DirectoryInfo(path);
foreach (FileInfo file in dir.GetFiles("*.csproj"))
{
projects.Add(Path.GetFileNameWithoutExtension(file.Name));
}
return projects;
}
public static List<string> LoadSolutionList(string path)
{
List<string> slutions = new List<string>();
DirectoryInfo dir = new DirectoryInfo(path);
foreach (FileInfo file in dir.GetFiles("*.sln"))
{
slutions.Add(Path.GetFileNameWithoutExtension(file.Name));
}
return slutions;
}
public static List<string> GetCodeFiles(string path)
{
List<string> files = new List<string>();
DirectoryInfo dir = new DirectoryInfo(path);
GetCodeFiles(dir, null, files);
return files;
}
private static void GetCodeFiles(DirectoryInfo dir, string subpath, List<string> files)
{
foreach (FileInfo file in dir.GetFiles())
{
if (file.Name.EndsWith(".cs", StringComparison.OrdinalIgnoreCase))
{
files.Add(subpath + file.Name);
}
}
foreach (DirectoryInfo subdir in dir.GetDirectories())
{
GetCodeFiles(subdir, subpath + subdir.Name + "\\", files);
}
}
public static List<FileItem> CountCodeFiles(string path, IEnumerable<string> files)
{
int lines, chars;
int total_lines = 0;
int total_chars = 0;
List<FileItem> items = new List<FileItem>();
foreach (string file in files)
{
if (file.EndsWith(".cs", StringComparison.OrdinalIgnoreCase))
{
TxtFile.CountLinesAndChars(Path.Combine(path, file), out lines, out chars);
total_lines += lines;
total_chars += chars;
items.Add(new FileItem(file, lines, chars));
}
}
items.Add(new FileItem("Total", total_lines, total_chars));
return items;
}
public static void Backup(string backupfile, string path, List<string> files)
{
ZipArchive archive = new ZipArchive();
foreach (string file in files)
{
archive.Add(path, file);
}
archive.Save(backupfile);
}
public static void Backup(string backupfile, string path, List<string> files, DateTime baseDate)
{
ZipArchive archive = new ZipArchive(baseDate);
foreach (string file in files)
{
archive.Add(path, file);
}
archive.Save(backupfile);
}
public static string BuildProject(string binPath, string projectfile)
{
// Instantiate a new Engine object
Engine engine = new Engine();
// Point to the path that contains the .NET Framework 2.0 CLR and tools
engine.BinPath = binPath;
engine.BuildEnabled = true;
BuildPropertyGroup buildProperties = new BuildPropertyGroup();
buildProperties.SetProperty("DebugSymbols", "false");
buildProperties.SetProperty("DebugType", "pdbonly");//pdbonly,full
buildProperties.SetProperty("Optimize", "true");
buildProperties.SetProperty("OutputPath", @"bin\Release\");
FileLogger logger = new FileLogger();
logger.Verbosity = Microsoft.Build.Framework.LoggerVerbosity.Minimal;
engine.RegisterLogger(logger);
// Build a project file
bool success = engine.BuildProjectFile(projectfile, null, buildProperties);
logger.Shutdown();
engine.UnloadAllProjects();
engine.UnregisterAllLoggers();
if (success)
{
return "Build succeeded.";
}
else
{
if (File.Exists("msbuild.log"))
{
return File.ReadAllText("msbuild.log");
}
else
{
return "Build failed.";
}
}
}
}
}