SuperDesign/Source/开发辅助工具/Manager/RyProject.cs

867 lines
43 KiB
C#
Raw Normal View History

using ExtendUI.FTPManager;
using Newtonsoft.Json.Linq;
using ryCommon;
using ryCommonDb;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.Runtime.ConstrainedExecution;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Linq;
namespace .Manager
{
class RyProject
{
/// <summary>
/// C#基准项目路径
/// </summary>
public string CshapeBasePath { get; private set; } = "";
/// <summary>
/// 引用dll文件夹列表
/// </summary>
public string ReferenceDllPath { get; private set; } = "";
/// <summary>
/// 是否将dll复制到Bin目录并修改引用
/// </summary>
public bool CopyDllToBin { get; set; } = false;
/// <summary>
/// Bin目录相对于项目文件所在的位置,可使用相对路径或绝对路径
/// </summary>
public string BinFolder { get; set; } = "..\\..\\Bin";
/// <summary>
/// 是否修改输出路径
/// </summary>
public bool ChangedOutputPath { get; set; } =true;
public delegate void StringEventHandler(object sender, string e);
/// <summary>
/// 状态变化时激发
/// </summary>
[Description("状态变化时激发")]
public event StringEventHandler OnStateChanged;
public RyProject()
{
UpdateSetting();
}
/// <summary>
/// 更新设置
/// </summary>
public void UpdateSetting()
{
DataProvider mydb = new DataProvider();
IDbInterface db = Itrycn_Db.CreateDataProvider(Itrycn_Db.dataType);
if (db.ConnDb(Itrycn_Db.User_SQLConn) == 1)
{
var ds = db.ReadData("select * from Settings where name='Setting'");
if (mydb.HaveData(ds))
{
var row = mydb.GetData(ds);
ryCommon.Storage mStor = new ryCommon.Storage(row["value"].ToString());
mStor.SelectNodeBySet();
CshapeBasePath = mStor.GetAttrValue("CshapeBasePath");
ReferenceDllPath = mStor.GetAttrValue("ReferenceDll");
}
}
db.Free();
}
/// <summary>
/// 通过dll路径来寻找dll路径
/// </summary>
/// <param name="dll_full_path"></param>
/// <returns></returns>
public string GetDllPath(string dll_full_path)
{
return GetDllPath("", dll_full_path);
}
/// <summary>
/// 通过dll名称来寻找dll路径
/// </summary>
/// <param name="dll_foldername">为空则表示根目录下查找,否则查找子目录</param>
/// <param name="dll_full_path"></param>
/// <returns></returns>
public string GetDllPath(string dll_foldername,string dll_full_path)
{
var dll_name = System.IO.Path.GetFileName(dll_full_path);
var path_list = ReferenceDllPath.Replace("\r", "").Split('\n');
//var find = false;
var result = "";
var Min_Ver = RySoft.GetVersionStr(dll_full_path);
var Min_dt=RyFiles.GetFileDate(dll_full_path);
#region dll,使dll
for (int m = 0; m < path_list.Length; m++)
{
if (path_list[m].Trim().Length==0) { continue; }
var path = path_list[m].Trim('\\');
if (dll_foldername.Length > 0) { path += "\\" + dll_foldername; }
if (!System.IO.Directory.Exists(path)) { continue; }
var files = System.IO.Directory.GetFiles(path);
for (int z = 0; z < files.Length; z++)
{
if (System.IO.Path.GetFileName(files[z]).ToLower() == dll_name.ToLower())
{
var dll_ver = RySoft.GetVersionStr(files[z]);
var compareVer = RySoft.CompareVer(Min_Ver, dll_ver);
if (compareVer < 0)//引用位置版本比较老,直接忽略
{
continue;
}
else if (compareVer == 0)//引用位置版本一致,则看更新时间
{
var file_dt=RyFiles.GetFileDate(files[z]);
if (file_dt.LastWriteTime <= Min_dt.LastWriteTime)
{
continue;
}
else
{
Min_dt=file_dt;
}
}
else if(compareVer==-1000)
{
continue;
}
else
{
Min_dt = RyFiles.GetFileDate(files[z]);
}
result = files[z];
Min_Ver=dll_ver;
//find = true;
}
}
//if (find) { break; }
}
#endregion
return result;
}
/// <summary>
/// 相对路径转绝对路径,相对项目文件的路径
/// </summary>
/// <returns></returns>
public string RelToAbsPath(string project_path,string rel_path)
{
string folder = System.IO.Path.GetDirectoryName(project_path);
var _rel_path = rel_path;
while (true)
{
if (_rel_path.IndexOf("..\\") == 0)
{
folder = System.IO.Path.GetDirectoryName(folder.TrimEnd('\\'));
_rel_path = _rel_path.Substring(3);
}
else { break; }
if (folder == "") { break; }
}
return folder+"\\"+ _rel_path;
}
/// <summary>
/// 绝对路径转相对路径,相对项目文件的路径
/// </summary>
/// <returns></returns>
public string AbsToRelPath(string project_path, string abs_path)
{
string folder = System.IO.Path.GetDirectoryName(project_path);
var _rel_path = "";
var _rel_path2 = "";
while (true)
{
if (abs_path.IndexOfEx(folder) == 0)
{
if (_rel_path2 == "")
{ _rel_path = abs_path.Substring(folder.Length); }
else
{
_rel_path = _rel_path2.TrimEnd('\\') + abs_path.Substring(folder.Length);
}
break;
}
else
{
folder = System.IO.Path.GetDirectoryName(folder.TrimEnd('\\'));
_rel_path2 += "..\\";
}
if (folder == "") { break; }
}
return _rel_path;
}
/// <summary>
/// 更新dll版本,如果全部复制成功则返回0,否则返回错误个数
/// </summary>
public int UpdateDlls(string folder,out string error_str)
{
var _error_str = "";
int error = 0;
Updates("",folder);
Updates("x86", folder+"\\x86");
Updates("x64", folder + "\\x64");
void Updates(string foldername,string _path)
{
if (!System.IO.Directory.Exists(_path)) { return; }
var files = System.IO.Directory.GetFiles(_path, "*.dll");
for (int i = 0; i < files.Length; i++)
{
string filename = System.IO.Path.GetFileName(files[i]);
var dllpath = GetDllPath(foldername, files[i]);
if (dllpath.Length>0)
{
if (filename.ToLower() == "System.Data.SQLite.dll".ToLower())
{
RyFiles.CreateDirectory(_path + "\\x86");
RyFiles.CreateDirectory(_path + "\\x64");
var sourch_folder = System.IO.Path.GetDirectoryName(dllpath);
if (RyFiles.CopyFolder(sourch_folder + "\\x86", _path + "\\x86\\") != 0)
{ _error_str += sourch_folder + "\\x86\\*\r\n"; error++; }
if (RyFiles.CopyFolder(sourch_folder + "\\x64\\", _path + "\\x64\\") != 0)
{ _error_str += sourch_folder + "\\x64\\*\r\n"; error++; }
}
if (dllpath!= files[i] && !RyFiles.CopyBigFile(dllpath, files[i]))
{ _error_str += files[i]+ "\r\n"; error++; }
var dll_xml_path = System.IO.Path.GetDirectoryName(dllpath) +"\\"+ System.IO.Path.GetFileNameWithoutExtension(dllpath) + ".xml";
if (System.IO.File.Exists(dll_xml_path))
{
var to_xml_path = System.IO.Path.GetDirectoryName(files[i]) + "\\" + System.IO.Path.GetFileNameWithoutExtension(files[i]) + ".xml";
if (dll_xml_path.ToLower()!=to_xml_path.ToLower() && !RyFiles.CopyBigFile(dll_xml_path, to_xml_path))
{ _error_str += files[i] + "\r\n"; error++; }
}
}
}
var dirs = System.IO.Directory.GetDirectories(_path);
for (int i = 0; i < dirs.Length; i++)
{
Updates(foldername,dirs[i]);
}
}
error_str = _error_str;
return error;
}
/// <summary>
/// 更新项目引用,定向为本地dll,如果全部复制成功则返回0,否则返回错误个数
/// </summary>
public int UpdateCSproj(string folder)
{
int error = 0;
Updates(folder);
void Updates(string _path)
{
var files = System.IO.Directory.GetFiles(_path, "*.csproj");
for (int i = 0; i < files.Length; i++)
{
SetCSproj(files[i], "");
}
var dirs = System.IO.Directory.GetDirectories(_path);
for (int i = 0; i < dirs.Length; i++)
{
Updates(dirs[i]);
}
}
return error;
}
/// <summary>
/// 自动设置csproj文件,将dll引用修改为指定区域的dll、修改命名空间
/// </summary>
/// <param name="path">项目文件(*.csproj)</param>
/// <param name="_project_Eng_name">项目英文名</param>
public void SetCSproj(string path, string _project_Eng_name)
{
System.Xml.XmlDocument xml = new System.Xml.XmlDocument();
xml.Load(path);
var xmlnsm = new XmlNamespaceManager(xml.NameTable);
xmlnsm.AddNamespace("d", xml.DocumentElement.NamespaceURI);
//var root = @"d:Project//d:ItemGroup//d:Reference";
if (_project_Eng_name != "")
{
SetValue(@"d:Project//d:PropertyGroup//d:RootNamespace", _project_Eng_name.Replace(" ", ""));//命名空间名
SetValue(@"d:Project//d:PropertyGroup//d:AssemblyName", _project_Eng_name.Replace(" ", ""));//程序集名称
}
var OutputPath = GetValue(@"d:Project//d:PropertyGroup[2]//d:OutputPath").TrimEnd('\\')+"\\";
if (ChangedOutputPath)
{
SetValue(@"d:Project//d:PropertyGroup[2]//d:OutputPath", BinFolder.TrimEnd('\\') + "\\Debug\\"+ (_project_Eng_name==""?"": _project_Eng_name +"\\"));//Debug输出路径
SetValue(@"d:Project//d:PropertyGroup[3]//d:OutputPath", BinFolder.TrimEnd('\\') + "\\Release\\" + (_project_Eng_name == "" ? "" : _project_Eng_name + "\\"));//Release输出路径
}
if (OutputPath == "") { OutputPath = BinFolder.TrimEnd('\\') + "\\Debug\\" + (_project_Eng_name == "" ? "" : _project_Eng_name + "\\"); }
var list = xml.SelectNodes(@"d:Project//d:ItemGroup//d:Reference//d:HintPath", xmlnsm);
for (int i = 0; i < list.Count; i++)
{
var HintPath = list[i].InnerText;
var iPos = HintPath.LastIndexOf("\\");
if (iPos > 0)
{
var Reference_Name = HintPath.Substring(iPos + 1);//引用的dll名称
var full_path = RelToAbsPath(path, OutputPath + Reference_Name);
var dll_path = GetDllPath(full_path);
if (dll_path.Length>0)
{
if (CopyDllToBin)
{
list[i].InnerText = OutputPath + Reference_Name;
RyFiles.CopyBigFile(dll_path, full_path);
}
else
{
list[i].InnerText = dll_path;
}
}
}
}
var ProjectReference_list = xml.SelectNodes(@"d:Project//d:ItemGroup//d:ProjectReference", xmlnsm);//项目引用
for (int i = 0; i < ProjectReference_list.Count; i++)
{
var element = (XmlElement)ProjectReference_list[i];
var IncludePath = element.GetAttribute("Include");
var iPos = IncludePath.LastIndexOf("\\");
if (iPos > 0)
{
var Reference_FileName = IncludePath.Substring(iPos + 1).ToLower();//引用的项目文件名称
string dll_name = "";
if (Reference_FileName == "RaUIV4.csproj".ToLower())
{ dll_name = "RaUI.dll"; }
else if (Reference_FileName == "MyDbV4.csproj".ToLower())
{ dll_name = "MyDb.dll"; }
else if (Reference_FileName == "MyDb_SQLiteV4.csproj".ToLower())
{ dll_name = "MyDb_SQLite.dll"; }
else if (Reference_FileName == "ryControlsV4.csproj".ToLower())
{ dll_name = "ryControls.dll"; }
else if (Reference_FileName == "RyPrint.csproj".ToLower())
{ dll_name = "RyPrint.dll"; }
else if (Reference_FileName == "ryUpdateV4.csproj".ToLower())
{ dll_name = "ryUpdate.dll"; }
if (dll_name != "")
{
var fullpath = RelToAbsPath(path, OutputPath + dll_name);
var dll_path = GetDllPath(fullpath);
if (dll_path != "")
{
if (CopyDllToBin)
{
MoveReference(System.IO.Path.GetFileNameWithoutExtension(dll_name), fullpath);
RyFiles.CopyBigFile(dll_path, fullpath);
}
else
{
MoveReference(System.IO.Path.GetFileNameWithoutExtension(dll_name), dll_path);
}
}
}
//将项目引用转换为dll引用
void MoveReference(string reference_name, string dll_path)
{
ProjectReference_list[i].ParentNode.RemoveChild(ProjectReference_list[i]);
var node = xml.SelectSingleNode(@"d:Project//d:ItemGroup", xmlnsm);
XmlNode childXmlNode = xml.CreateElement("Reference");
XmlNode childXmlNode2 = xml.CreateElement("HintPath");
childXmlNode2.InnerText = dll_path;
childXmlNode.AppendChild(childXmlNode2);
node.AppendChild(childXmlNode);
XmlElement element2 = (XmlElement)childXmlNode;
element2.SetAttribute("Include", reference_name);
}
}
}
xml.InnerXml = xml.InnerXml.Replace(" xmlns=\"\"", "");
xml.Save(path);
string GetValue(string xpath)
{
var node = xml.SelectSingleNode(xpath, xmlnsm);
if (node != null)
{
return node.InnerText;
}
return "";
}
bool SetValue(string xpath, string value)
{
var node = xml.SelectSingleNode(xpath, xmlnsm);
if (node != null)
{
node.InnerText = value; return true;
}
return false;
}
}
/// <summary>
/// 获取版本号
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
public string GetAssemblyVersion(string path)
{
var AssemblyInfo_Path = System.IO.Path.GetDirectoryName(path) + "\\Properties\\AssemblyInfo.cs";
if (System.IO.File.Exists(AssemblyInfo_Path))
{
var AssemblyInfo = ryCommon.RyFiles.ReadAllLines(AssemblyInfo_Path);
for (int i = 0; i < AssemblyInfo.Length; i++)
{
if (AssemblyInfo[i].StartsWith("//")) { continue; }
if (AssemblyInfo[i].StartsWith("[assembly: AssemblyVersion"))
{
return AssemblyInfo[i].GetStr("AssemblyVersion(\"", "\")");
}
}
return "";
}
else
{
return "";
}
}
/// <summary>
/// 更新版本号
/// </summary>
/// <param name="AssemblyInfo_Path"></param>
public static void UpdateVer(string AssemblyInfo_Path)
{
string AssemblyInfo_path = AssemblyInfo_Path;
if (System.IO.File.Exists(AssemblyInfo_path))
{
var ext = System.IO.Path.GetExtension(AssemblyInfo_path).ToLower();
string Revision_Ver = DateTime.Now.ToString("yyMM");
string Build_Ver = DateTime.Now.ToString("dd00");
if (ext == ".cs")
{
string[] AssemblyInfo_list = ryCommon.RyFiles.ReadAllLines(AssemblyInfo_path);
string text = "";
for (int i = 0; i < AssemblyInfo_list.Length; i++)
{
string item = AssemblyInfo_list[i];
if (item.IndexOf("[assembly: AssemblyVersion(\"") == 0)
{
ChangeVer("[assembly: AssemblyVersion(\"");
}
else if (item.IndexOf("[assembly: AssemblyFileVersion(\"") == 0)
{
ChangeVer("[assembly: AssemblyFileVersion(\"");
}
if (text != "") { text += "\r\n"; }
text += item;
void ChangeVer(string id)
{
string ver = item.GetStr(id, "\")]", 0, out _, "");
if (ver != "")
{
string[] ver_list = ver.Split('.');
if (ver_list.Length == 4)
{
if (ver_list[2] != Revision_Ver)
{
ver = ver_list[0] + "." + ver_list[1] + "." + Revision_Ver + "." + (Build_Ver.ToInt() + 1).ToString("0000");
}
else
{
if (ver_list[3].IndexOf(DateTime.Now.ToString("dd")) == 0)
{
ver = ver_list[0] + "." + ver_list[1] + "." + Revision_Ver + "." + (ver_list[3].ToInt() + 1).ToString("0000");
}
else
{
ver = ver_list[0] + "." + ver_list[1] + "." + Revision_Ver + "." + (Build_Ver.ToInt() + 1).ToString("0000");
}
}
item = id + ver + "\")]";
}
}
}
}
ryCommon.RyFiles.WriteAllText(AssemblyInfo_path, text, Encoding.UTF8);
}
else if (ext == ".csproj")
{
System.Xml.XmlDocument xml = new System.Xml.XmlDocument();
xml.Load(AssemblyInfo_path);
var xmlnsm = new XmlNamespaceManager(xml.NameTable);
xmlnsm.AddNamespace("d", xml.DocumentElement.NamespaceURI);
var root = @"d:Project//d:PropertyGroup//d:";
bool set_result= SetValue("Version");
if (!set_result)
{
var ver = "1.0." + Revision_Ver + "." + (Build_Ver.ToInt() + 1).ToString("0000");
XmlNode node_PropertyGroup = xml.CreateNode(XmlNodeType.Element, "PropertyGroup", xml.DocumentElement.NamespaceURI);
xml.ChildNodes[0].PrependChild(node_PropertyGroup);
SetValue2("Version", ver, "程序集版本号");
SetValue2("FileVersion", ver, "文件版本号,通常与程序集版本号相同");
SetValue2("ProductVersion", ver, "产品版本号");
SetValue2("AssemblyName", System.IO.Path.GetFileNameWithoutExtension(AssemblyInfo_path), "可选:程序集名称");
SetValue2("AssemblyTitle", "", "可选:程序集标题");
SetValue2("AssemblyDescription", "", "可选:程序集描述");
SetValue2("Company", "睿元网络", "可选:程序集公司");
SetValue2("Product", "", "可选:程序集产品");
SetValue2("Trademark", "紫林软件2008-" + DateTime.Now.Year, "可选:程序集商标");
void SetValue2(string name2, string ver2, string desc)
{
XmlComment tempNode_desc = xml.CreateComment(desc);
tempNode_desc.InnerText = desc;
XmlElement tempNode_node = xml.CreateElement(name2, xml.DocumentElement.NamespaceURI);
tempNode_node.InnerText = ver2;
node_PropertyGroup.AppendChild(tempNode_desc);
node_PropertyGroup.AppendChild(tempNode_node);
}
}
else
{
SetValue("FileVersion");
SetValue("ProductVersion");
}
xml.Save(AssemblyInfo_path);
bool SetValue(string name)
{
var node = xml.SelectSingleNode(root + name, xmlnsm);
if (node != null)
{
var ver = node.InnerText;
string[] ver_list = ver.Split('.');
if (ver_list.Length == 4)
{
if (ver_list[2] != Revision_Ver)
{
ver = ver_list[0] + "." + ver_list[1] + "." + Revision_Ver + "." + (Build_Ver.ToInt() + 1).ToString("0000");
}
else
{
if (ver_list[3].IndexOf(DateTime.Now.ToString("dd")) == 0)
{
ver = ver_list[0] + "." + ver_list[1] + "." + Revision_Ver + "." + (ver_list[3].ToInt() + 1).ToString("0000");
}
else
{
ver = ver_list[0] + "." + ver_list[1] + "." + Revision_Ver + "." + (Build_Ver.ToInt() + 1).ToString("0000");
}
}
}
node.InnerText= ver;
return true;
}
return false;
}
}
}
}
/// <summary>
/// 获取版本信息
/// </summary>
/// <param name="AssemblyInfo_Path"></param>
public static VerInfo GetVerInfo(string AssemblyInfo_Path)
{
string AssemblyInfo_path = AssemblyInfo_Path;
var ver = new VerInfo();
if (System.IO.File.Exists(AssemblyInfo_path))
{
var ext = System.IO.Path.GetExtension(AssemblyInfo_path).ToLower();
if (ext == ".cs")
{
string[] AssemblyInfo_list = ryCommon.RyFiles.ReadAllLines(AssemblyInfo_path);
for (int i = 0; i < AssemblyInfo_list.Length; i++)
{
string item = AssemblyInfo_list[i];
if (item.IndexOf("[assembly: AssemblyVersion(\"") == 0)
{
ver.Version = item.GetStr("[assembly: AssemblyVersion(\"", "\")]", 0, out _, "").Trim();
}
else if (item.IndexOf("[assembly: AssemblyFileVersion(\"") == 0)
{
ver.FileVersion = item.GetStr("[assembly: AssemblyFileVersion(\"", "\")]", 0, out _, "");
}
else if (item.IndexOf("[assembly: AssemblyTitle(\"") == 0)
{
ver.Title = item.GetStr("[assembly: AssemblyTitle(\"", "\")]", 0, out _, "");
}
else if (item.IndexOf("[assembly: AssemblyDescription(\"") == 0)
{
ver.Description = item.GetStr("[assembly: AssemblyDescription(\"", "\")]", 0, out _, "");
}
else if (item.IndexOf("[assembly: AssemblyCompany(\"") == 0)
{
ver.Company = item.GetStr("[assembly: AssemblyCompany(\"", "\")]", 0, out _, "");
}
else if (item.IndexOf("[assembly: AssemblyProduct(\"") == 0)
{
ver.Product = item.GetStr("[assembly: AssemblyProduct(\"", "\")]", 0, out _, "");
}
else if (item.IndexOf("[assembly: AssemblyCopyright(\"") == 0)
{
ver.Copyright = item.GetStr("[assembly: AssemblyCopyright(\"", "\")]", 0, out _, "");
}
}
}
else if (ext == ".csproj")
{
try
{
System.Xml.XmlDocument xml = new System.Xml.XmlDocument();
xml.Load(AssemblyInfo_path);
var xmlnsm = new XmlNamespaceManager(xml.NameTable);
xmlnsm.AddNamespace("d", xml.DocumentElement.NamespaceURI);
var root = @"d:Project//d:PropertyGroup//d:";
ver.Version = GetValue("Version");
ver.FileVersion = GetValue("FileVersion");
ver.Title = GetValue("AssemblyTitle");
ver.Description = GetValue("AssemblyDescription");
ver.Company = GetValue("Company");
ver.Product = GetValue("Product");
ver.Copyright = GetValue("Trademark");
string GetValue(string name)
{
var node = xml.SelectSingleNode(root + name, xmlnsm);
if (node != null)
{
return node.InnerText;
}
return "";
}
}
catch { }
}
}
return ver;
}
/// <summary>
/// 等待进程执行完毕
/// </summary>
/// <param name="cmd_text"></param>
/// <returns></returns>
public string Read_Prog(string exe, string cmd_text)
{
String cmd = exe;
Process p = new Process
{
StartInfo = new System.Diagnostics.ProcessStartInfo
{
FileName = cmd,//设定程序名
Arguments = cmd_text,
UseShellExecute = false, //关闭shell的使用
RedirectStandardInput = true, //重定向标准输入
RedirectStandardOutput = true, //重定向标准输出
RedirectStandardError = false, //重定向错误输出
CreateNoWindow = true//设置不显示窗口
}
};
p.Start();
string result = p.StandardOutput.ReadToEnd();
p.WaitForExit(20000);
p.Close();
return result;
}
/// <summary>
/// 进行打包
/// </summary>
/// <param name="project_folder">项目根目录</param>
/// <param name="PackByLite">最简化打包</param>
public void Pack(string project_folder,bool PackByLite=false)
{
BigFileOp file_op = new BigFileOp();
file_op.OnCanelCopy += File_op_OnCanelCopy;
var com_mode = "Debug";
DataProvider mydb = new DataProvider();
IDbInterface db = Itrycn_Db.CreateDataProvider(Itrycn_Db.dataType);
if (db.ConnDb(Itrycn_Db.User_SQLConn) == 1)
{
var ds = db.ReadData("select * from Settings where name='Setting'");
if (mydb.HaveData(ds))
{
var row = mydb.GetData(ds);
ryCommon.Storage mStor = new ryCommon.Storage(row["value"].ToString());
mStor.SelectNodeBySet();
var ReactorPath = mStor.GetAttrValue("ReactorPath");
var WinRARPath = mStor.GetAttrValue("WinRARPath");
if (WinRARPath == "")
{
if (System.IO.File.Exists(@"C:\Program Files\WinRAR\WinRAR.exe"))
{
WinRARPath = @"C:\Program Files\WinRAR\WinRAR.exe";
}
}
var ftpid = mStor.GetAttrValue("ftpid", 0);
var ftp_remote_dir = mStor.GetAttrValue("ftp_remote_dir");
var bf_folder = project_folder;
if (bf_folder != "")
{
ryCommon.Ini ini = new ryCommon.Ini(bf_folder + "\\查看项目.ryp");
var eng_name = ini.ReadIni("project", "engname");
var proglang = ini.ReadIni("project", "proglang");
var confuse = ini.ReadIni("project", "confuse",1);
var upload_name = ini.ReadIni("project", "UploadName");
if (upload_name.Trim().Length == 0) { upload_name = eng_name; }
var ouput_folder = bf_folder + "\\Bin\\" + com_mode + "\\" + eng_name;
if(!System.IO.Directory.Exists(ouput_folder))
{
ouput_folder = bf_folder + "\\Bin\\" + com_mode;
}
if (!System.IO.Directory.Exists(ouput_folder))
{
ShowState("打包失败,生成目录不存在。");
return;
}
var file_ver = "";
if (System.IO.File.Exists(ouput_folder + "\\" + eng_name + ".exe"))
{
FileVersionInfo fileVerInfo = System.Diagnostics.FileVersionInfo.GetVersionInfo(ouput_folder + "\\" + eng_name + ".exe");
file_ver = fileVerInfo.ProductVersion;
}
if (proglang == "c#" && confuse==1)
{
ShowState("正在进行混淆...");
if (System.IO.File.Exists(bf_folder + "\\Bin\\混淆_" + com_mode + ".nrproj"))
{
var cmd = Read_Prog(ReactorPath, "-project \"" + bf_folder + "\\Bin\\混淆_" + com_mode + ".nrproj\"");
MessageBox.Show(cmd, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
ShowState("正在清理不重要的缓存...");
ryCommon.RyFiles.DeleteFile(ouput_folder + "\\Secure\\*.pdb");
ShowState("复制混淆文件到底包目录...");
file_op.CopyFileOrFolder(ouput_folder + "\\Secure\\", bf_folder + "\\Publish\\OriginalFiles"+(PackByLite?"_Lite":"")+"\\");
}
#region
ShowState("复制自定义规则文件到底包目录...");
var Publish = ryCommon.RyFiles.ReadAllLines(bf_folder + "\\Publish\\Publish.set");
for (int m = 0; m < Publish.Length; m++)
{
var line = Publish[m].Trim();
if (line == "" || line.IndexOf("#") == 0) { continue; }
if (line.IndexOfEx("del:") == 0)
{
ryCommon.RyFiles.DeleteFile(bf_folder + "\\Publish\\OriginalFiles"+ (PackByLite ? "_Lite" : "") + "\\" + line.Substring(4));
}
else if (line.IndexOfEx("copy:") == 0)
{
var item = line.Substring(5);
if(item.StartsWith("lite=>")) { //精简版才生效
if (PackByLite)
{
item = item.Substring(6);
}
else
{
continue;
}
}
if (item.StartsWith("!lite=>")) //非精简版才生效
{
if (PackByLite)
{
continue;
}
else
{
item = item.Substring(7);
}
}
if (item.Contains("<") && item.Contains(">"))
{
DataSet ds_var = db.ReadData("select * from VarInfo");
if (mydb.HaveData(ds_var))
{
for (int n = 0; n < ds_var.Tables[0].Rows.Count; n++)
{
DataRow row_var = ds_var.Tables[0].Rows[n];
item = item.Replace("<" + row_var["VarName"].ToString() + ">", row_var["VarValue"].ToString());
if (!item.Contains("<") || !item.Contains(">"))
{
break;
}
}
}
}
var from_to = item.Replace("->", "|").Split('|');
if (from_to.Length == 2)
{
var from_path = from_to[0];
var to_path = from_to[1];
if(from_path.IndexOfEx(":")<0 && from_path.IndexOfEx("<") < 0)
{
from_path= ouput_folder + "\\" + from_path;
}
if (from_path.IndexOfEx("<") >= 0) { continue; }
var from_filename = System.IO.Path.GetFileName(from_path);
if (from_filename.IndexOfEx("*") >= 0)
{
var file_list = System.IO.Directory.GetFiles(System.IO.Path.GetDirectoryName(from_path),from_filename);
if (file_list != null)
{
for (int i = 0; i < file_list.Length; i++)
{
file_op.CopyFileOrFolder(file_list[i], bf_folder + "\\Publish\\OriginalFiles"+ (PackByLite ? "_Lite" : "") + "\\" + to_path);
}
}
var dir_list = System.IO.Directory.GetDirectories(System.IO.Path.GetDirectoryName(from_path), from_filename);
if (file_list != null)
{
for (int i = 0; i < dir_list.Length; i++)
{
file_op.CopyFileOrFolder(dir_list[i], bf_folder + "\\Publish\\OriginalFiles"+ (PackByLite ? "_Lite" : "") + "\\" + to_path);
}
}
}
else
{
file_op.CopyFileOrFolder(from_path, bf_folder + "\\Publish\\OriginalFiles"+ (PackByLite ? "_Lite" : "") + "\\" + to_path);
}
}
}
}
#endregion
ShowState("正在打包...");
if (System.IO.File.Exists(bf_folder + "\\Publish\\Green\\" + eng_name + ".zip"))
{ RyFiles.DeleteFile(bf_folder + "\\Publish\\Green\\" + eng_name + ".zip"); }
var cmd2 = Read_Prog(WinRARPath, "-r -ep1 a \"" + bf_folder + "\\Publish\\Green\\" + eng_name + ".zip\" \"" + bf_folder + "\\Publish\\OriginalFiles"+ (PackByLite ? "_Lite" : "") + "\\\"");
RyFiles.CopyBigFile(bf_folder + "\\Publish\\Green\\" + eng_name + ".zip", bf_folder + "\\Publish\\Green\\HistoryVer\\" + eng_name + "_" + file_ver + ".zip");
ShowState("打包完成...");
if (ftpid > 0)
{
Application.OpenForms[0].Invoke(new Action(() =>
{
SuperDesign.Manager.FTP.FrmUploadUpdateZipToFtp frm = new SuperDesign.Manager.FTP.FrmUploadUpdateZipToFtp();
frm.LocalPath = bf_folder + "\\Publish\\Green\\" + eng_name + ".zip";
frm.EngName = upload_name;
frm.FTPId = ftpid;
frm.RemoteDir = ftp_remote_dir;
if (frm.ShowDialog() == DialogResult.OK)
{
ShowState("上传完成...");
}
frm.Dispose();
}));
}
}
}
}
db.Free();
void ShowState(string text)
{
OnStateChanged?.Invoke(this,text);
}
}
private void File_op_OnCanelCopy(object sender, CancelEventArgs e, string FromPath, string ToPath)
{
if(RyFiles.GetFileSize(FromPath)==RyFiles.GetFileSize(ToPath))
{
var dt1 = RyFiles.GetFileDate(FromPath);
var dt2 = RyFiles.GetFileDate(ToPath);
if(dt1.LastWriteTime==dt2.LastWriteTime)
{
e.Cancel = true;
}
}
}
}
public class VerInfo
{
public string Title { get; set; } = "";
public string Description { get; set; } = "";
public string Company { get; set; } = "";
public string Product { get; set; } = "";
public string Copyright { get; set; } = "";
public string Version { get; set; } = "";
public string FileVersion { get; set; } = "";
}
}