using ExportMap.db; using Npgsql; using System; using System.Collections.Generic; using System.Configuration; using System.Data.Common; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; using System.Security.AccessControl; using System.Security.Principal; using System.Web; namespace ExportMap.cs { public class Tool { /// /// 基础目录 /// public static readonly string BaseDir = AppDomain.CurrentDomain.BaseDirectory; private static string tempDir; public static string TempDir { get { if (string.IsNullOrWhiteSpace(tempDir)) { tempDir = Path.Combine(BaseDir, "temp"); if (!Directory.Exists(tempDir)) Directory.CreateDirectory(tempDir); } return tempDir; } } private static PostgreHelper _dbHelper; /// /// DB帮助类 /// public static PostgreHelper DBHelper { get { if (null == _dbHelper) { _dbHelper = new PostgreHelper(DbEnum.langfang); } return _dbHelper; } } /// /// 字节格式化 /// public static string FormatBytes(long bytes) { string[] Suffix = { "Byte", "KB", "MB", "GB", "TB" }; int i = 0; double dblSByte = bytes; if (bytes > 1024) for (i = 0; (bytes / 1024) > 0; i++, bytes /= 1024) dblSByte = bytes / 1024.0; return String.Format("{0:0.##}{1}", dblSByte, Suffix[i]); } /// /// 获取设置 /// public static string GetSetting(string key) { return ConfigurationManager.AppSettings[key]; } /// /// 获取Db参数 /// public static List GetParams(string sql, T t) { List list = new List(); Type tType = typeof(T); BindingFlags flags = BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.Instance; int start = sql.IndexOf("@"); while (start != -1) { int end = sql.IndexOf(",", start); if (end == -1) end = sql.IndexOf(")", start); if (end == -1) end = sql.IndexOf(" ", start); if (end == -1) end = sql.Length; string name = sql.Substring(start + 1, end - start - 1); PropertyInfo pi = tType.GetProperty(name, flags); if (pi != null) { object value = pi.GetValue(t, null); DbParameter dp = new NpgsqlParameter("@" + name, value); list.Add(dp); } start = sql.IndexOf("@", end); } return list; } /// /// 创建目录 /// public static void CreateDirectory(string dir) { WindowsIdentity wi = WindowsIdentity.GetCurrent(); FileSystemAccessRule rule = new FileSystemAccessRule(wi.User, FileSystemRights.FullControl, AccessControlType.Allow); DirectorySecurity ds = new DirectorySecurity(); ds.AddAccessRule(rule); Directory.CreateDirectory(dir, ds); } /// /// 克隆对象 /// public static T Clone(T source) where T : new() { if (!typeof(T).IsSerializable) { throw new ArgumentException("The type must be serializable.", "source"); } // Don't serialize a null object, simply return the default for that object if (Object.ReferenceEquals(source, null)) { return default(T); } using (Stream stream = new MemoryStream()) { IFormatter formatter = new BinaryFormatter(); formatter.Serialize(stream, source); stream.Seek(0, SeekOrigin.Begin); return (T)formatter.Deserialize(stream); } } /// /// 执行CMD /// /// 命令行 /// 执行结果或出错信息 public static String ExecCmd(string cmd, bool isPy = false) { string str = null; try { Process p = new Process(); p.StartInfo.FileName = "cmd.exe"; p.StartInfo.UseShellExecute = false; p.StartInfo.CreateNoWindow = true; p.StartInfo.RedirectStandardInput = true; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.RedirectStandardError = true; p.Start(); StreamWriter si = p.StandardInput; // 标准输入流 StreamReader so = p.StandardOutput; // 标准输出流 StreamReader se = p.StandardError; // 标准错误流 LogOut.Info("cmd = " + cmd); si.AutoFlush = true; if (isPy) { si.WriteLine("cd \"C:\\Program Files\\QGIS 3.16\\apps\\Python37\""); si.WriteLine("\"C:\\Program Files\\QGIS 3.16\\bin\\qgis_process-qgis-ltr.bat\""); // python-qgis-ltr.bat } si.WriteLine(cmd); si.WriteLine("exit"); string info = so.ReadToEnd(); str = se.ReadToEnd(); if (!string.IsNullOrEmpty(info)) LogOut.Debug(info); if (!string.IsNullOrEmpty(str)) LogOut.Error(str); if (p.HasExited == false) p.Kill(); se.Close(); so.Close(); si.Close(); p.Close(); } catch (Exception ex) { LogOut.Error(ex.StackTrace); str = ex.Message; } return str; } } }