using Npgsql;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data.SQLite;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Security.Cryptography;
using System.Web;
namespace JiangSu.cs
{
public class Tools
{
private static PostgreHelper _pgHelper;
///
/// DB帮助类
///
public static PostgreHelper PGHelper
{
get
{
if (null == _pgHelper)
{
_pgHelper = new PostgreHelper();
}
return _pgHelper;
}
}
///
/// 获取参数列表
///
public static DbParameter[] GetPGParams(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);
NpgsqlParameter dp = new NpgsqlParameter("@" + name, value);
list.Add(dp);
}
start = sql.IndexOf("@", end);
}
return list.ToArray();
}
///
/// 获取参数列表
///
public static SQLiteParameter[] GetSQLiteParams(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);
SQLiteParameter dp = new SQLiteParameter("@" + name, value);
list.Add(dp);
}
start = sql.IndexOf("@", end);
}
return list.ToArray();
}
///
/// 字节格式化
///
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]);
}
///
/// 计算文件的MD5码
///
public static string CalcFileMD5(string filePath)
{
using (var md5 = new MD5CryptoServiceProvider())
{
using (var stream = File.OpenRead(filePath))
{
byte[] hash = md5.ComputeHash(stream);
return BitConverter.ToString(hash).Replace("-", "").ToLower();
}
}
}
///
/// 获取图片的GPS信息
///
public static List GetImgGps(string path)
{
Image img = null;
try
{
img = Image.FromFile(path);
var items = img.PropertyItems.OrderByDescending(x => x.Id);
List list = new List { "0", "0", "0" };
foreach (PropertyItem item in items)
{
if (item.Id >= 0x0000 && item.Id <= 0x001e) // 只取Id范围为0x0000到0x001e
{
switch (item.Id)
{
case 0x0002: // 设置纬度
list[1] = GetGpsVal(item.Value);
break;
case 0x0004: // 设置经度
list[0] = GetGpsVal(item.Value);
break;
case 0x0006:
if (item.Value.Length == 8)
{
double altitude = BitConverter.ToUInt32(item.Value, 0) * 1.0d / BitConverter.ToUInt32(item.Value, 4);
list[2] = altitude.ToString("0.000");
}
break;
}
}
}
return list;
}
catch (Exception ex)
{
LogOut.Error(ex.Message + "\r\n" + ex.StackTrace);
return null;
}
finally
{
if (null != img) img.Dispose();
}
}
public static string GetImgPointZ(string path)
{
List list = GetImgGps(path);
return null == list ? null : string.Format("POINT Z ({0})", string.Join(" ", list.ToArray()));
}
///
/// 获取GPS值
///
private static string GetGpsVal(byte[] bytes)
{
if (bytes.Length != 24) return "0";
//degrees(将byte[0]~byte[3]转成uint, 除以byte[4]~byte[7]转成的uint)
double d = BitConverter.ToUInt32(bytes, 0) * 1.0d / BitConverter.ToUInt32(bytes, 4);
//minutes(将byte[8]~byte[11]转成uint, 除以byte[12]~byte[15]转成的uint)
double m = BitConverter.ToUInt32(bytes, 8) * 1.0d / BitConverter.ToUInt32(bytes, 12);
//seconds(将byte[16]~byte[19]转成uint, 除以byte[20]~byte[23]转成的uint)
double s = BitConverter.ToUInt32(bytes, 16) * 1.0d / BitConverter.ToUInt32(bytes, 20);
double val = (((s / 60 + m) / 60) + d);
return val.ToString("0.00000000");
}
}
}