using MJTop.Data; using System; using System.Collections.Generic; using System.Collections.Specialized; using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Security.AccessControl; namespace DBCHM { /// /// 管理 配置的连接字符串 /// public static class ConfigUtils { /// /// 当前应用程序的名称 /// private static string ConfigFileName = Path.GetFileNameWithoutExtension(AppDomain.CurrentDomain.FriendlyName).Replace(".vshost", ""); /// /// 定义配置存放的路径 /// public static string AppPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData, Environment.SpecialFolderOption.Create), ConfigFileName); /// /// sqlite db文件的存放路径 /// private static string ConfigFilePath = string.Empty; /// /// 针对配置的 数据库操作对象 /// private static DB db = null; /// /// 初始化静态数据 /// 将sqlite数据库写入 C:\Users\用户名\AppData\Local\DBChm 目录中 /// static ConfigUtils() { try { if (!ZetaLongPaths.ZlpIOHelper.DirectoryExists(AppPath)) { ZetaLongPaths.ZlpIOHelper.CreateDirectory(AppPath); } AddSecurityControll2Folder(AppPath); ConfigFilePath = Path.Combine(AppPath, ConfigFileName + ".db"); Init(); } catch (Exception ex) { LogUtils.LogError("ConfigUtils初始化", Developer.SysDefault, ex); } } /// /// 初始化创建配置数据库 /// private static void Init() { db = DBMgr.UseDB(DBType.SQLite, ConfigFilePath); string strSql = @"create table DBCHMConfig ( Id integer PRIMARY KEY autoincrement, Name nvarchar(200) unique, DBType varchar(30), Server varchar(100), Port integer, DBName varchar(100), Uid varchar(50), Pwd varchar(100), ConnTimeOut integer, ConnString text, Modified text )"; //表不存在则创建 连接字符串 配置表 if (db.Info.TableNames == null || !db.Info.TableNames.Contains(nameof(DBCHMConfig), StringComparer.OrdinalIgnoreCase)) { db.ExecSql(strSql); //执行后,刷新实例 表结构信息 db.Info.Refresh(); } else { // v1.7.3.7 版本 增加 连接超时 与 最后连接时间 var info = db.Info; if(!info.IsExistColumn(nameof(DBCHMConfig), nameof(DBCHMConfig.Modified))) { var configs = db.GetListDictionary("select * from " + nameof(DBCHMConfig)); db.Info.DropTable(nameof(DBCHMConfig)); db.ExecSql(strSql); //执行后,刷新实例 表结构信息 db.Info.Refresh(); if (configs != null && configs.Count > 0) { foreach (var config in configs) { try { db.Insert(config, nameof(DBCHMConfig)); } catch (Exception ex) { LogUtils.LogError("Init", Developer.SysDefault, ex, config); } } db.ExecSql("update " + nameof(DBCHMConfig) + " set ConnTimeOut = 120 "); } } } } /// /// 判断磁盘路径下是否安装存在某个文件,最后返回存在某个文件的路径 /// /// /// /// public static bool IsInstall(string[] installPaths, out string installPath) { installPath = string.Empty; var driInfos = DriveInfo.GetDrives(); foreach (DriveInfo dInfo in driInfos) { if (dInfo.DriveType == DriveType.Fixed) { foreach (string ipath in installPaths) { string path = Path.Combine(dInfo.Name, ipath); if (File.Exists(path)) { installPath = path; return true; } } } } return false; } /// /// 检测是否安装某个软件,并返回软件的卸载安装路径 /// /// /// /// public static bool CheckInstall(string softName, string str_exe, out string installPath) { //即时刷新注册表 SHChangeNotify(0x8000000, 0, IntPtr.Zero, IntPtr.Zero); installPath = string.Empty; bool isFind = false; var uninstallNode = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall", false); if (uninstallNode != null) { //LocalMachine_64 using (uninstallNode) { foreach (var subKeyName in uninstallNode.GetSubKeyNames()) { var subKey = uninstallNode.OpenSubKey(subKeyName); string displayName = (subKey.GetValue("DisplayName") ?? string.Empty).ToString(); string path = (subKey.GetValue("UninstallString") ?? string.Empty).ToString(); Console.WriteLine(displayName); if (displayName.Contains(softName) && !string.IsNullOrWhiteSpace(path)) { installPath = Path.Combine(Path.GetDirectoryName(path), str_exe); if (File.Exists(installPath)) { isFind = true; break; } } } } } if (!isFind) { //LocalMachine_32 uninstallNode = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", false); using (uninstallNode) { foreach (var subKeyName in uninstallNode.GetSubKeyNames()) { var subKey = uninstallNode.OpenSubKey(subKeyName); string displayName = (subKey.GetValue("DisplayName") ?? string.Empty).ToString(); string path = (subKey.GetValue("UninstallString") ?? string.Empty).ToString(); Console.WriteLine(displayName); if (displayName.Contains(softName) && !string.IsNullOrWhiteSpace(path)) { installPath = Path.Combine(Path.GetDirectoryName(path), str_exe); if (File.Exists(installPath)) { isFind = true; break; } } } } } return isFind; } [DllImport("shell32.dll")] public static extern void SHChangeNotify(uint wEventId, uint uFlags, IntPtr dwItem1, IntPtr dwItem2); /// ///为文件夹添加users,everyone用户组的完全控制权限 /// /// public static void AddSecurityControll2Folder(string dirPath) { //获取文件夹信息 DirectoryInfo dir = new DirectoryInfo(dirPath); if (dir.Exists) { //获得该文件夹的所有访问权限 System.Security.AccessControl.DirectorySecurity dirSecurity = dir.GetAccessControl(AccessControlSections.All); //设定文件ACL继承 InheritanceFlags inherits = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit; //添加ereryone用户组的访问权限规则 完全控制权限 FileSystemAccessRule everyoneFileSystemAccessRule = new FileSystemAccessRule("Everyone", FileSystemRights.FullControl, inherits, PropagationFlags.None, AccessControlType.Allow); //添加Users用户组的访问权限规则 完全控制权限 FileSystemAccessRule usersFileSystemAccessRule = new FileSystemAccessRule("Users", FileSystemRights.FullControl, inherits, PropagationFlags.None, AccessControlType.Allow); bool isModified = false; dirSecurity.ModifyAccessRule(AccessControlModification.Add, everyoneFileSystemAccessRule, out isModified); dirSecurity.ModifyAccessRule(AccessControlModification.Add, usersFileSystemAccessRule, out isModified); //设置访问权限 dir.SetAccessControl(dirSecurity); } } /// /// 添加或修改配置连接 /// /// public static void Save(NameValueCollection dbCHMConfig) { db.Save(dbCHMConfig, "DBCHMConfig"); } public static void UpLastModified(int id) { db.ExecSql("update DBCHMConfig set Modified='" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "' where id=" + id); } /// /// 删除连接 /// /// public static void Delete(int id) { db.Delete("DBCHMConfig", "Id", id); } /// /// 查询出所有配置的连接 /// /// public static List SelectAll() { return db.GetDataTable("select * from DBCHMConfig order by Modified desc ").ConvertToListObject(); } /// /// 得到其中1个连接 /// /// /// public static DBCHMConfig Get(int id) { return db.GetDataTable("select * from DBCHMConfig where id = " + id).ConvertToListObject().FirstOrDefault(); } /// /// 判断配置表是否存在连接字符串 /// /// public static bool HasValue() { string strSql = "select count(1) from DBCHMConfig"; return db.Single(strSql, 0) > 0; } } }