编辑
2019-06-12
我当开发
00

目录

1. 及时处理
2. 资源嵌入和使用
3. 解压
4. 运行bat

刚写了个winform的安装程序,

导言

刚写了个winform的安装程序,在此做下记录

1. 及时处理

挺常用的,以下来自引用:

因为winform的消息循环是一个线程来处理,那么假如你的某个操作比较耗时,那么消息处理得等你这个耗时操作做完了才能继续,而Application.DoEvents方法就是允许你在耗时操作的内部调用它,而去处理消息队列中的消息。

Application.DoEvents

在此做下记录

2. 资源嵌入和使用

因为我想着最后生成的是一个大exe,里面用到的包通过嵌入资源的方式都生成到exe中了(exe的文件会很大),用的时候再拿出来

嵌入资源

用的时候通过读取资源文件流,保存到临时文件,安装完成后再删除

//获得正在运行类所在的名称空间 Type type = MethodBase.GetCurrentMethod().DeclaringType; string _namespace = type.Namespace; //临时文件 string folderPath = Application.StartupPath + @"\临时文件res"; Directory.CreateDirectory(folderPath); //获得当前运行的Assembly Assembly _assembly = Assembly.GetExecutingAssembly(); //文件名 string name = "activemq.zip"; //根据名称空间和文件名生成资源名称 string resourceName = _namespace + ".res."+ name; //根据资源名称从Assembly中获取此资源的Stream Stream stream = _assembly.GetManifestResourceStream(resourceName); //全部的资源名 //string[] resNames = _assembly.GetManifestResourceNames(); byte[] srcBuf = new Byte[stream.Length]; stream.Read(srcBuf, 0, srcBuf.Length); stream.Seek(0, SeekOrigin.Begin); //保存文件到本地 try { using (FileStream fs = new FileStream(folderPath+ @"\"+ name, FileMode.OpenOrCreate, FileAccess.Write)) { fs.Write(srcBuf, 0, srcBuf.Length); fs.Close(); } } catch (Exception ex) { }

删除

DirectoryInfo subdir = new DirectoryInfo(Application.StartupPath + @"\临时文件res"); subdir.Delete(true); //删除子目录和文件

3. 解压

jar包利用代码解压后文件损坏了……,网上找了好几个,终于有一个是可以用的,可以做到无损。还是用的 ICSharpCode.SharpZipLib.dll 也作为资源嵌入了

ZipHelper.UnpackFiles(Application.StartupPath + "\\临时文件res\\activemq.zip", @"c:\MQ");//解压 jar uf更新 jar xf解压
/// <summary> /// 解压缩文件 /// </summary> /// <param name="zipFile">待解压缩的文件</param> /// <param name="directory">解压缩后文件存放的目录</param> public static bool UnpackFiles(string zipFile, string directory) { if (!Directory.Exists(directory)) Directory.CreateDirectory(directory); ZipInputStream stream = new ZipInputStream(File.OpenRead(zipFile)); ZipEntry theEntry = null; while ((theEntry = stream.GetNextEntry()) != null) { string directoryName = Path.GetDirectoryName(theEntry.Name); string fileName = Path.GetFileName(theEntry.Name); if (directoryName != string.Empty) Directory.CreateDirectory(directory + "\\" + directoryName); if (fileName != string.Empty) { FileStream streamWriter = File.Create(Path.Combine(directory, theEntry.Name)); int size = 2048; byte[] data = new byte[size]; while (true) { size = stream.Read(data, 0, data.Length); if (size > 0) streamWriter.Write(data, 0, size); else break; } streamWriter.Close(); } } stream.Close(); return true; }

4. 运行bat

启动MQ时候直接运行的bat

System.Diagnostics.Process proc = new System.Diagnostics.Process(); proc.StartInfo.WorkingDirectory = @"c:\MQ\bin\win64"; proc.StartInfo.FileName = "activemq.bat"; proc.StartInfo.Arguments = string.Format("10");//this is argument proc.StartInfo.CreateNoWindow = false; //proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;//这里设置DOS窗口不显示,经实践可行 proc.Start();
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:没想好

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!