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 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);
}
}
///
/// 执行Python
///
/// 命令行
/// 执行结果或出错信息
public static String ExecPython(string cmd)
{
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;
si.WriteLine("\"C:\\Program Files\\QGIS 3.16\\bin\\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;
}
}
}