You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
548 lines
20 KiB
548 lines
20 KiB
using Tiobon.Core.OPS.Tool.OPS.Tool.Model;
|
|
using ICSharpCode.SharpZipLib.Core;
|
|
using ICSharpCode.SharpZipLib.Zip;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text.RegularExpressions;
|
|
using System.Net;
|
|
using System.Net.NetworkInformation;
|
|
using System.Security.Cryptography;
|
|
using System.Text;
|
|
using System.Threading;
|
|
using System.Windows.Forms;
|
|
using System.Runtime.Serialization.Formatters.Binary;
|
|
using System.Dynamic;
|
|
|
|
namespace Tiobon.Core.OPS.Tool.OPS.Tool.Helper
|
|
{
|
|
public static class Const
|
|
{
|
|
public static Config config { get; set; }
|
|
public static List<MultiEnvInfo> MultiEnvs { get; set; }
|
|
public static string Version { get; set; }
|
|
public static string Script_path { get; set; }
|
|
private static string Task_log = "";
|
|
public static string Port { get; set; }
|
|
|
|
#region 写日志
|
|
private static string LastLog;
|
|
public static void write_log(string log)
|
|
{
|
|
lock (config)
|
|
{
|
|
try
|
|
{
|
|
if (LastLog != log)
|
|
{
|
|
Directory.CreateDirectory("Logs");
|
|
string filename = "Logs/" + DateTime.Now.ToString("yyyy-MM-dd") + ".log";
|
|
using (StreamWriter fs = new StreamWriter(filename, true))
|
|
{
|
|
fs.Write(DateTime.Now.ToString("yy-MM-dd HH:mm:ss") + $": {log}\n");
|
|
}
|
|
LastLog = log;
|
|
}
|
|
}
|
|
catch { }
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region 写运行状态
|
|
public static void write_task_log(string taskinfo)
|
|
{
|
|
Task_log = taskinfo;
|
|
write_log(taskinfo);
|
|
}
|
|
#endregion
|
|
|
|
#region 读取运行状态
|
|
public static string read_task_log()
|
|
{
|
|
return Task_log;
|
|
}
|
|
#endregion
|
|
|
|
#region 获取文件md5值
|
|
public static string GetMD5(string filePath)
|
|
{
|
|
FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
|
|
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
|
|
byte[] hash_byte = md5.ComputeHash(file);
|
|
string str = System.BitConverter.ToString(hash_byte);
|
|
str = str.Replace("-", "");
|
|
return str;
|
|
}
|
|
#endregion
|
|
|
|
#region aes加密解密
|
|
/// <summary>
|
|
/// aes加密
|
|
/// </summary>
|
|
/// <param name="text"></param>
|
|
/// <param name="key"></param>
|
|
/// <returns></returns>
|
|
public static string AesEncrypt(string text, string key)
|
|
{
|
|
if (string.IsNullOrEmpty(text)) return null;
|
|
Byte[] toEncryptArray = Encoding.UTF8.GetBytes(text);
|
|
|
|
RijndaelManaged rm = new RijndaelManaged
|
|
{
|
|
Key = Encoding.UTF8.GetBytes(key),
|
|
Mode = CipherMode.ECB,
|
|
Padding = PaddingMode.PKCS7
|
|
};
|
|
|
|
ICryptoTransform cTransform = rm.CreateEncryptor();
|
|
Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
|
|
|
|
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
|
|
}
|
|
|
|
/// <summary>
|
|
/// AES 解密
|
|
/// </summary>
|
|
/// <param name="str">明文(待解密)</param>
|
|
/// <param name="key">密文</param>
|
|
/// <returns></returns>
|
|
public static string AesDecrypt(string str, string key)
|
|
{
|
|
if (string.IsNullOrEmpty(str)) return null;
|
|
Byte[] toEncryptArray = Convert.FromBase64String(str);
|
|
|
|
RijndaelManaged rm = new RijndaelManaged
|
|
{
|
|
Key = Encoding.UTF8.GetBytes(key),
|
|
Mode = CipherMode.ECB,
|
|
Padding = PaddingMode.PKCS7
|
|
};
|
|
|
|
ICryptoTransform cTransform = rm.CreateDecryptor();
|
|
Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
|
|
|
|
return Encoding.UTF8.GetString(resultArray);
|
|
}
|
|
#endregion
|
|
|
|
#region zip解压
|
|
/// <summary>
|
|
/// 检查文件是否已损坏
|
|
/// </summary>
|
|
/// <param name="comment"></param>
|
|
/// <returns></returns>
|
|
public static bool Is_BadZip(string fname, out string comment)
|
|
{
|
|
comment = string.Empty;
|
|
try
|
|
{
|
|
using (FileStream fs = new FileStream(fname, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
|
|
{
|
|
ZipFile entry = new ZipFile(fname);
|
|
comment = entry.ZipFileComment;
|
|
}
|
|
return true;
|
|
}
|
|
catch
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 快速解压
|
|
/// </summary>
|
|
/// <param name="zipFilePath">压缩文件路径</param>
|
|
/// <param name="extractPath">解压路径</param>
|
|
/// <param name="pwd">压缩密码</param>
|
|
/// <param name="progressFun">进程</param>
|
|
/// <param name="seconds">触发时间</param>
|
|
/// <param name="comment">注释</param>
|
|
public static void ExtractZipFile(string zipFilePath, string extractPath, string pwd, ProcessFileHandler progressFun)
|
|
{
|
|
FastZipEvents events = new FastZipEvents();
|
|
if (progressFun != null)
|
|
{
|
|
//events.ProcessDirectory =
|
|
events.ProcessFile += progressFun;
|
|
events.ProgressInterval += TimeSpan.FromSeconds(0.2);
|
|
}
|
|
FastZip zip = new FastZip(events);
|
|
zip.CreateEmptyDirectories = true;
|
|
if (!string.IsNullOrEmpty(pwd))
|
|
zip.Password = pwd;
|
|
zip.UseZip64 = UseZip64.On;
|
|
zip.RestoreAttributesOnExtract = true;
|
|
zip.RestoreDateTimeOnExtract = true;
|
|
zip.ExtractZip(zipFilePath, extractPath, FastZip.Overwrite.Always, null, "", "", true);
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 解压指定文件
|
|
/// </summary>
|
|
/// <param name="zipFilePath">压缩文件路径</param>
|
|
/// <param name="extractPath">解压路径</param>
|
|
/// <param name="pwd">压缩密码</param>
|
|
/// <param name="progressFun">进程</param>
|
|
/// <param name="seconds">触发时间</param>
|
|
public static void ExtractSpecifyZipFile(string zipFilePath, string extractPath, string pwd, List<string> files)
|
|
{
|
|
using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipFilePath)))
|
|
{
|
|
ZipEntry theEntry;
|
|
while ((theEntry = s.GetNextEntry()) != null)
|
|
{
|
|
if (files.Contains(theEntry.Name))
|
|
{
|
|
Directory.CreateDirectory(extractPath);
|
|
using (FileStream streamWriter = File.Create(extractPath + "//" + theEntry.Name))
|
|
{
|
|
int size = 2048;
|
|
byte[] data = new byte[2048];
|
|
while (true)
|
|
{
|
|
size = s.Read(data, 0, data.Length);
|
|
if (size > 0)
|
|
{
|
|
streamWriter.Write(data, 0, size);
|
|
}
|
|
else
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region 递归删除目录
|
|
/// <summary>
|
|
/// 递归删除目录
|
|
/// </summary>
|
|
/// <param name="strPath"></param>
|
|
/// <returns></returns>
|
|
public static bool DeleteADirectory(string strPath)
|
|
{
|
|
string[] strTemp;
|
|
try
|
|
{
|
|
//先删除该目录下的文件
|
|
strTemp = System.IO.Directory.GetFiles(strPath);
|
|
foreach (string str in strTemp)
|
|
{
|
|
System.IO.File.Delete(str);
|
|
}
|
|
//删除子目录,递归
|
|
strTemp = System.IO.Directory.GetDirectories(strPath);
|
|
foreach (string dir in strTemp)
|
|
{
|
|
if (Path.GetDirectoryName(dir + "\\").ToLower() == Path.GetDirectoryName(strPath + "/files/").ToLower() || Path.GetDirectoryName(dir + "\\").ToLower() == Path.GetDirectoryName(strPath + "/Logs/").ToLower())
|
|
{
|
|
continue;
|
|
}
|
|
if (Path.GetDirectoryName(dir + "\\").ToLower() == Path.GetDirectoryName($"{config.install_dir}/app/hfs/wwwroot/").ToLower())
|
|
{
|
|
continue;
|
|
}
|
|
DeleteADirectory(dir);
|
|
}
|
|
//删除该目录
|
|
System.IO.Directory.Delete(strPath);
|
|
return true;
|
|
}
|
|
catch
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region 检测端口占用
|
|
public static bool PortInUse(int port)
|
|
{
|
|
bool inUse = false;
|
|
IPGlobalProperties ipProperties = IPGlobalProperties.GetIPGlobalProperties();
|
|
IPEndPoint[] ipEndPoints = ipProperties.GetActiveTcpListeners();
|
|
|
|
foreach (IPEndPoint endPoint in ipEndPoints)
|
|
{
|
|
if (endPoint.Port == port)
|
|
{
|
|
inUse = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return inUse;
|
|
}
|
|
#endregion
|
|
|
|
#region 复制目录
|
|
public static void CopyDirectory(string sourceDirPath, string saveDirPath)
|
|
{
|
|
try
|
|
{
|
|
if (!Directory.Exists(sourceDirPath))
|
|
{
|
|
Console.WriteLine("源目录不存在,请核对!");
|
|
}
|
|
|
|
if (!Directory.Exists(saveDirPath))
|
|
{
|
|
Directory.CreateDirectory(saveDirPath);
|
|
}
|
|
string[] files = Directory.GetFiles(sourceDirPath);
|
|
|
|
foreach (string file in files)
|
|
{
|
|
string pFilePath = saveDirPath + @"\" + Path.GetFileName(file);
|
|
|
|
//if (File.Exists(pFilePath))
|
|
// continue;
|
|
write_task_log($"正在复制文件:{Path.GetFileName(file)}");
|
|
File.Copy(file, pFilePath, true);
|
|
}
|
|
|
|
string[] dirs = Directory.GetDirectories(sourceDirPath);
|
|
foreach (string dir in dirs)
|
|
{
|
|
if (Path.GetDirectoryName(dir + "\\").ToLower() == Path.GetDirectoryName(sourceDirPath + "/files/").ToLower() || Path.GetDirectoryName(dir + "\\").ToLower() == Path.GetDirectoryName(sourceDirPath + "/Logs/").ToLower())
|
|
{
|
|
continue;
|
|
}
|
|
if (Path.GetDirectoryName(dir + "\\").ToLower() == Path.GetDirectoryName($"{config.install_dir}/app/hfs/wwwroot/").ToLower())
|
|
{
|
|
continue;
|
|
}
|
|
CopyDirectory(dir, saveDirPath + @"\" + Path.GetFileName(dir));
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
throw ex;
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region 关闭指定目录的程序
|
|
/// <summary>
|
|
/// 检测指定目录程序是否运行
|
|
/// </summary>
|
|
/// <param name="name"></param>
|
|
/// <param name="path"></param>
|
|
/// <returns></returns>
|
|
public static void Kill_Exe(string name, string path = "")
|
|
{
|
|
Process[] ps = Process.GetProcesses();
|
|
foreach (Process process in ps)
|
|
{
|
|
if (process.ProcessName.ToLower() == name.ToLower())
|
|
{
|
|
try
|
|
{
|
|
if (path == "")
|
|
{
|
|
process.Kill();
|
|
process.WaitForExit();
|
|
}
|
|
else if (process.MainModule.FileName.ToLower().Contains(Path.GetDirectoryName(path).ToLower()))
|
|
{
|
|
process.Kill();
|
|
process.WaitForExit();
|
|
}
|
|
}
|
|
catch (System.ComponentModel.Win32Exception)
|
|
{
|
|
continue;
|
|
}
|
|
catch (InvalidOperationException)
|
|
{
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region 关闭指定目录的句柄
|
|
/// <summary>
|
|
/// 关闭指定目录的句柄
|
|
/// </summary>
|
|
/// <param name="path"></param>
|
|
/// <returns></returns>
|
|
public static void Kill_Path(string path)
|
|
{
|
|
Process[] ps = Process.GetProcesses();
|
|
try
|
|
{
|
|
foreach (Process process in ps)
|
|
{
|
|
try
|
|
{
|
|
if (Path.GetDirectoryName(process.MainModule.FileName).ToLower().Contains(Path.GetDirectoryName(path).ToLower()))
|
|
{
|
|
process.Kill();
|
|
Thread.Sleep(500);
|
|
}
|
|
}
|
|
catch (System.ComponentModel.Win32Exception)
|
|
{
|
|
continue;
|
|
}
|
|
catch (InvalidOperationException)
|
|
{
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
throw ex;
|
|
}
|
|
|
|
}
|
|
#endregion
|
|
|
|
#region 重启应用程序
|
|
/// <summary>
|
|
/// 重启应用程序
|
|
/// </summary>
|
|
public static void ReStart()
|
|
{
|
|
Application.ExitThread();
|
|
Application.Exit();
|
|
Application.Restart();
|
|
Process.GetCurrentProcess().Kill();
|
|
}
|
|
#endregion
|
|
|
|
#region 多环境管理
|
|
/// <summary>
|
|
/// 保存多环境数据
|
|
/// </summary>
|
|
public static void SaveMultiEnv()
|
|
{
|
|
try
|
|
{
|
|
string fname = AppDomain.CurrentDomain.BaseDirectory + "\\Config\\MultiEnv.dat";
|
|
if (File.Exists(fname))
|
|
File.Delete(fname);
|
|
using (FileStream fs = new FileStream(fname, FileMode.Create))
|
|
{
|
|
BinaryFormatter bf = new BinaryFormatter();
|
|
//将list序列化到文件中
|
|
bf.Serialize(fs, MultiEnvs);
|
|
}
|
|
}
|
|
catch (Exception E)
|
|
{
|
|
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 读取多环境数据
|
|
/// </summary>
|
|
public static void ReadMultiEnv()
|
|
{
|
|
try
|
|
{
|
|
string fname = AppDomain.CurrentDomain.BaseDirectory + "\\Config\\MultiEnv.dat";
|
|
if (File.Exists(fname))
|
|
{
|
|
using (FileStream fs = new FileStream(fname, FileMode.Open))
|
|
{
|
|
fs.Seek(0, SeekOrigin.Begin);
|
|
BinaryFormatter bf = new BinaryFormatter();
|
|
//将list序列化到文件中
|
|
MultiEnvs = bf.Deserialize(fs) as List<MultiEnvInfo>;
|
|
}
|
|
}
|
|
}
|
|
catch (Exception E)
|
|
{
|
|
|
|
}
|
|
|
|
if (MultiEnvs is null)
|
|
{
|
|
MultiEnvs = new List<MultiEnvInfo>
|
|
{
|
|
new MultiEnvInfo{ Ip = config.ip, Name = "生产",FileName="produse" ,DefaultPort = "600", DefaultMask = "60" },
|
|
new MultiEnvInfo{ Ip = config.ip, Name = "测试1",FileName="test1" , DefaultPort = "601", DefaultMask = "61" },
|
|
new MultiEnvInfo{ Ip = config.ip, Name = "测试2", FileName="test2" ,DefaultPort = "602", DefaultMask = "62" },
|
|
new MultiEnvInfo{ Ip = config.ip, Name = "测试3", FileName="test3" ,DefaultPort = "603", DefaultMask = "63" },
|
|
new MultiEnvInfo{ Ip = config.ip, Name = "测试4",FileName="test4" , DefaultPort = "604", DefaultMask = "64" },
|
|
};
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region 判断匿名类属性是否存在
|
|
|
|
public static bool DoesPropertyExist(dynamic settings, string name)
|
|
{
|
|
if (settings is ExpandoObject)
|
|
return ((IDictionary<string, object>)settings).ContainsKey(name);
|
|
|
|
return settings.GetType().GetProperty(name) != null;
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region 将指定文件夹下面的所有内容copy到目标文件夹下面 果目标文件夹为只读属性就会报错。
|
|
/****************************************
|
|
* 函数名称:CopyDir
|
|
* 功能说明:将指定文件夹下面的所有内容copy到目标文件夹下面 果目标文件夹为只读属性就会报错。
|
|
* 参 数:srcPath:原始路径,aimPath:目标文件夹
|
|
* 调用示列:
|
|
* string srcPath = Server.MapPath("test/");
|
|
* string aimPath = Server.MapPath("test1/");
|
|
* Utilities.FileOperate.CopyDir(srcPath,aimPath);
|
|
*****************************************/
|
|
/// <summary>
|
|
/// 指定文件夹下面的所有内容copy到目标文件夹下面
|
|
/// </summary>
|
|
/// <param name="srcPath">原始路径</param>
|
|
/// <param name="aimPath">目标文件夹</param>
|
|
public static void CopyDir(string srcPath, string aimPath)
|
|
{
|
|
try
|
|
{
|
|
// 检查目标目录是否以目录分割字符结束如果不是则添加之
|
|
if (aimPath[aimPath.Length - 1] != Path.DirectorySeparatorChar)
|
|
aimPath += Path.DirectorySeparatorChar;
|
|
// 判断目标目录是否存在如果不存在则新建之
|
|
if (!Directory.Exists(aimPath))
|
|
Directory.CreateDirectory(aimPath);
|
|
// 得到源目录的文件列表,该里面是包含文件以及目录路径的一个数组
|
|
//如果你指向copy目标文件下面的文件而不包含目录请使用下面的方法
|
|
string[] fileList = Directory.GetFileSystemEntries(srcPath);
|
|
//遍历所有的文件和目录
|
|
foreach (string file in fileList)
|
|
{
|
|
//先当作目录处理如果存在这个目录就递归Copy该目录下面的文件
|
|
|
|
if (Directory.Exists(file))
|
|
CopyDir(file, aimPath + Path.GetFileName(file));
|
|
//否则直接Copy文件
|
|
else
|
|
File.Copy(file, aimPath + Path.GetFileName(file), true);
|
|
}
|
|
}
|
|
catch (Exception ee)
|
|
{
|
|
throw new Exception(ee.ToString());
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
}
|
|
}
|
|
|