前面通过一系列的NX二次开发已经基本完成了项目对NX的需求了,接着就是将插件打包给用户使用了。使用过程很简单只要将文件拷贝至任意目录并添加环境变量UGII_USER_DIR即可,为了方便一般都会放在NX安装目录中方便以后管理。这里就一个小问题就是如果以前已经配置了UGII_USER_DIR并使用着插件,重新配置容易把一起的给丢失了。为了给用户更好的体验,所以今天花了点时间整理了下需求让今年的“菁干班”写了个简单的NXPlug install程序,我小小的修改了下界面并做下记录。

​检测NX程序是否安装

检测程序是否安装可以通过注册表来是实现,因为程序安装的时候会为程式添加注册表信息,UG可以通过UGII_BASE_DIR变量来确认是否已安装UG程序。是否配置UGII_USER_DIR变量,这个变量程序安装时时没有的一版用在程序二次开发时候定义的,检测它的目的是为了指到用户之前是否已经定义过该变量,如果有则说明该用户之前已经配置过UG插件了。

private void SecondStep_Load(object sender, EventArgs e){    RegistryKey root = Registry.LocalMachine;   // 加载注册表LocalMachine    string path = "SystemCurrentControlSetControlSession ManagerEnvironment";    // 环境变量的注册表位置    var rootkey = root.OpenSubKey(path, true);    var rk = rootkey.GetValue("UGII_BASE_DIR");   // 变量名UGII_BASE_DIR的值    if (rk != null)    // 是否存在 UG    {        Public.isExistsUg = true;        label6.Text = "UG程式已安装";        string PathValue = rk.ToString();  // UG的路径        rk = rootkey.GetValue("UGII_USER_DIR");   // 获取UGII_USER_DIR的值        var userdir = rootkey.GetValue("UGII_USER_DIR");          if (userdir != null)    // 是否存在UGII_USER_DIR变量名        {            string UserPath = userdir.ToString();                 Public.userToolDir = UserPath;                    // 如果存在,记录用户的安装目录            PathValue = PathValue + Public.defaultDir;        }        else        {            RegistryKey userroot = Registry.CurrentUser;            string user_env_path = "Environment";            var rootkey_user = userroot.OpenSubKey(user_env_path, true);            var rk_user = rootkey_user.GetValue("UGII_USER_DIR");   // 在用户目录中查找            if (rk_user != null)            {                PathValue = PathValue + Public.defaultDir;                string UserPath = rk_user.ToString();     // UGII_USER_DIR的值                Public.userToolDir = UserPath;            }            else            {                PathValue = PathValue + Public.defaultDir;    // 如果不存在,将安装目录设置为UGII_BASE_DIR + NXPlug            }        }        if (Public.userToolDir == "")        {            Public.UG_PATH = PathValue;        }        else        {            Public.UG_PATH = Public.userToolDir;        }        textBox1.Text = Public.UG_PATH;    }    else    {        label6.Text = "UG程式未安装";        textBox1.Text = "没有UG程式";    } }

选择文件安装路径

如果系统已经配置了UGII_USER_DIR变量,那么我们优先安装到已有的目录。当然用户也可以选择自己想安装的目录,所以我们提供了一个浏览选择功能给用户选择自定义安装目录。

安装路径检测

判断下用户的安装路径是否有修改,如果没有则直接将我们的插件程序集成到已有的插件目录中去。如果有做修改我们就将之前的插件程序拷贝到我们的新的安装目录中来。

private void btnNextStep_Click(object sender, EventArgs e){    if (textBox1.Text.Trim() != Public.UG_PATH)   // 是否修改了安装路径    {        Public.isChange = true;    }    if (Public.isExistsUg == true)         // 存在UG才进行下一步    {        if (Public.isChange)        {            DialogResult result = MessageBox.Show("检测到你修改了安装目录,确认使用此目录安装吗?", "确认安装", MessageBoxButtons.YesNo, MessageBoxIcon.Question);            if (result != DialogResult.Yes)     // 点击了确认            {                textBox1.Text = Public.UG_PATH;                Public.isChange = false;                return;            }        }        RegistryKey root = Registry.LocalMachine;   // 加载注册表LocalMachine        string path = "SystemCurrentControlSetControlSession ManagerEnvironment";    // 环境变量的注册表位置        var rootkey = root.OpenSubKey(path, true);        Public.UG_PATH = textBox1.Text.Trim();        CopyFile(textBox1.Text.Trim());        if (Public.userToolDir != "")        // 如果用户已有配置文件,将其复制过来        {            CopyDirectory(Public.userToolDir, Public.UG_PATH, true);        }        if (Public.isRight == true)          // 如果路径是合法的,写入注册表        {            rootkey.SetValue("UGII_USER_DIR", textBox1.Text.Trim());            Last last = new Last();            this.Visible = false;            last.Show();        }    }    else    {        MessageBox.Show("请先安装UG程式。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);    }}

检测文件是否存在

获取当前应用程序所在目录,检测程序中的文件是否存在。接着检测安装目录是否存在相同的目录如果有的话提示用户是否许哟啊覆盖,如果没有则尝试创建新的安装目录。

private void CopyFile(string purpath){    string workdir = System.IO.Directory.GetCurrentDirectory();    bool istrue = Directory.Exists(purpath);    if (!istrue)    {        try    // 尝试创建文件夹        {            Directory.CreateDirectory(purpath);        }        catch (Exception ex)        {            MessageBox.Show("请检查路径是否正确!");            Public.isRight = false;            return;        }    }    string fromdir = workdir + "NXPlug";    if (!Directory.Exists(fromdir))     // 是否存在源文件夹    {        MessageBox.Show("缺失源文档。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Information);        Public.isRight = false;        return;    }    bool isdone = CopyDirectory(fromdir, purpath, false);    if (!isdone)       // 是否存在同名文件    {        DialogResult result = MessageBox.Show("目标位置有相同文件,确认覆盖吗?", "确认", MessageBoxButtons.YesNo, MessageBoxIcon.Question);        if (result == DialogResult.Yes)        {            // 复制文件            CopyDirectory(fromdir, purpath, true);        }    }}

文件及文件夹复制

复制文件包括文件夹及文件,判断下路径后面有没有''字符没有的话我们添加下。拷贝文件可以通过CopyTo方法来实现,拷贝文件夹可以通过CopyDirectory来实现。所有的文件拷贝我们用个递归就可以轻松的实现了,记得在拷贝前先检查目录是否存在如果没有的话要先创建该目标目录。

private static bool CopyDirectory(string SourcePath, string DestinationPath, bool overwriteexisting){    bool ret = false;    try    {        SourcePath = SourcePath.EndsWith(@"") ? SourcePath : SourcePath + @""; //源文件路径        DestinationPath = DestinationPath.EndsWith(@"") ? DestinationPath : DestinationPath + @""; //目标路径        if (Directory.Exists(SourcePath))        {            if (Directory.Exists(DestinationPath) == false)                Directory.CreateDirectory(DestinationPath);            foreach (string fls in Directory.GetFiles(SourcePath)) //递归,遍历文件            {                FileInfo flinfo = new FileInfo(fls);                flinfo.CopyTo(DestinationPath + flinfo.Name, overwriteexisting);            }            foreach (string drs in Directory.GetDirectories(SourcePath)) //递归,遍历文件夹            {                DirectoryInfo drinfo = new DirectoryInfo(drs);                if (CopyDirectory(drs, DestinationPath + drinfo.Name, overwriteexisting) == false)                    ret = false;            }        }        ret = true;    }    catch (Exception ex)    {        ret = false;    }    return ret;}

公共类文件

上面看到的一些赋值操作是在应用中创建了一个公共类方便其他窗口进行调用的,比如说完成页面中提示的目标路径就是从公共类中提取出来的。这样简单的程序没必要新建一个公共类文件来存储数据的,可以直接实例化第一个窗口并获取其定义的数据。

class Public{    public static string UG_PATH = "";          // 自动获取的安装目录    public static bool isChange = false;      //  判断用户时候更改了目录    public static bool isExistsUg = false;    //  判断是否有UG    public static bool isRight = true;       // 判断目录路径是否正确    public static string userToolDir = "";   // 用户原来配置的路径    public static string defaultDir = "NXPlug";}//窗体一namespace install{    public partial class SecondStep : Form    {        public string dome = "这是第一个窗体中的数据";    }}//窗体二namespace install{    public partial class Last : Form    {        private void Last_Load(object sender, EventArgs e)        {            SecondStep data = new SecondStep();            label3.Text = data.dome;        }    }}

​更多C#实战技巧可以参考专栏:C#实战系列

c# dialogresult 选择文件_C#实战037:一个简单的入门应用程序NXPlug install相关推荐

  1. 如何用c#打开文件夹并选择文件夹内的一个文件 open folder and select file

    如何用c#打开文件夹并选择文件夹内的一个文件 open folder and select file: 在运行中可以输入"Explorer /select,D:\somefile.txt&q ...

  2. 3.2 Lucene实战:一个简单的小程序

    在讲解Lucene索引和检索的原理之前,我们先来实战Lucene:一个简单的小程序! 一.索引小程序 首先,new一个java project,名字叫做LuceneIndex. 然后,在project ...

  3. Windows下编译TensorFlow1.3 C++ library及创建一个简单的TensorFlow C++程序

    参考:https://www.cnblogs.com/jliangqiu2016/p/7642471.html Windows下编译TensorFlow1.3 C++ library及创建一个简单的T ...

  4. hosts多个ip对应一个主机名_一个简单的Web应用程序,用作连接到ssh服务器的ssh客户端...

    WebSSH 一个简单的Web应用程序,用作连接到ssh服务器的ssh客户端.它是用Python编写的,基于tornado,paramiko和xterm.js. 特征 支持SSH密码验证,包括空密码. ...

  5. 如何构建一个简单的语音识别应用程序

    "In this 10-year time frame, I believe that we'll not only be using the keyboard and the mouse ...

  6. Linux环境使用命名空间编写一个简单的容器应用程序:namespace,container,cgroups

    目录 使用命名空间编写一个简单的容器应用程序 创建一个子进程– fork vs clone 具有clone(2)的命名空间 简单示例 - CLONE_NEWPID 隔离网络接口 - CLONE_NEW ...

  7. Vulkan是什么?和我一起完成一个简单的Vulkan应用程序

    在本章,你将学到: Vulkan以及它背后的基本原理: 如何创建一个最简单的Vulkan应用程序: 在本书其余部分将使用到的术语和概念. 本章将介绍并解释Vulkan是什么.我们会介绍API背后的基本 ...

  8. 城乡投票源码php_一个简单的PHP投票程序源码

    一个简单的PHP投票程序源码 2021-01-23 10:04:50721 分析: 我们利用一个文件(data.dat)来存储投票栏目.每个栏目占据一行. 这样一来,便可随意加入和减去想要投票的栏目. ...

  9. 一个简单的键盘钩子程序(ZZZ)

    一个简单的键盘钩子程序 从哪儿抄来的忘了,不过写的很简单明了 实现适时监视键盘,并将按键信息保存在TXT文件中的程序         Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都 ...

最新文章

  1. Python设置环境变量,改变GnomeConnectionManager的语言
  2. centos mysql5.6.35_centos_mysql5.6.35_rpm安装
  3. Android MediaRecorder架构详解
  4. JVM插码之三:javaagent介绍及javassist介绍
  5. linux交换分区的文件格式为,LINUX的交换分区或交换文件SWAP的查看与维护
  6. 动态规划(最长递增子序列)---最长摆动子序列
  7. JavaSE各阶段练习题----Map
  8. protobuf在java应用中通过反射动态创建对象
  9. Java之对List里面的对象名字进行模糊查询
  10. kotlin 类和对象_Kotlin程序| 类和对象的示例(带有学生数据)
  11. linux内核模块实验,linux内核模块实验(2学时).doc
  12. 物联网项目(三)平台架构
  13. Python教学视频(六)关系及逻辑运算
  14. 性能优化之电量和网络
  15. day06笔记(2021-09-28)-OOP:面向对象+封装+继承+多态
  16. win10 安装硕正
  17. PHP socket以及http、socket、tcp、udp
  18. PHP 对接美团大众点评团购券(门票)
  19. 一个小的java作业,第一次上传CSDN,原创的
  20. Facebook营销策略大全,脸书营销技巧详细教程

热门文章

  1. 每日一皮:我靠,这个分枝真的merge回主干了!
  2. 从这个11.11开始,终结数据结构与算法的噩梦
  3. linux sed命令新文件名,linux中sed命令批量修改
  4. file:///f:winwwwxml2.php,php simplexml_load_file 中文乱码的解决方法
  5. OpenCV-Python 雪花飘落特效
  6. morphologyEx 形态学
  7. Legacy autograd function with non-static forward method is deprecated. Please use new-style autograd
  8. qgridlayout 动态刷新
  9. Cannot load onnxruntime.capi. Error: DLL load failed: 找不到指定的模块
  10. Expected more than 1 value per channel when training, got input size torch.Size