Winform(C#.NET)自动更新组件的使用及部分功能实现(一点改进功能)
2024-10-14 02:56:45
接前两篇继续:
Winform(C#.NET)自动更新组件的使用及部分功能实现
Winform(C#.NET)自动更新组件的使用及部分功能实现(续)
借鉴文章:http://www.cnblogs.com/jeffersyuan/archive/2007/04/18/718108.html
现象:
由于dll文件比较多,再加之变更比较频繁,而每次点击createxmltools都会重新生成不同的version,
而实际上文件并未发生变化,导致重复更新,浪费资源。
解决方法:
根据文件的信息生成一个哈希值,通过比较哈希值来判断文件是否进行了修改。
主要使用类:MD5CryptoServiceProvider
类的注释:使用加密服务提供程序 (CSP) 提供的实现,计算输入数据的 System.Security.Cryptography.MD5 哈希值。
/// <summary>
/// md5加密文件为hashcode,看文件是否真的有变化
/// </summary>
/// <param name="fileName">文件fullname</param>
/// <returns>根据MD5CryptoServiceProvider加密后的一个值</returns>
private string MD5(string fileName)
{
string temp = "";
FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
byte[] md5byte = md5.ComputeHash(fs); int i, j;
foreach (byte b in md5byte)
{
i = Convert.ToInt32(b);
j = i >> ;
temp = temp + Convert.ToString(j, );
j = ((i << ) & 0x00ff) >> ;
temp = temp + Convert.ToString(j, );
}
return temp;
}
在createxmltools的项目修改
foreach (FileInfo f in dicInfo.GetFiles())
{
//排除当前目录中生成xml文件的工具文件
if (!getRidOfFiles.Contains(f.Name))
{
string path = dicInfo.FullName.Replace(currentDirectory, "").Replace("\\", "/");
string folderPath=string.Empty;
if (path != string.Empty)
{
folderPath = path.TrimStart('/') + "/";
}
XmlElement child = doc.CreateElement("file");
child.SetAttribute("path", folderPath + f.Name);
child.SetAttribute("url", url + path + "/" + f.Name);
child.SetAttribute("lastver", FileVersionInfo.GetVersionInfo(f.FullName).FileVersion);
child.SetAttribute("size", f.Length.ToString());
child.SetAttribute("needRestart", "false");
child.SetAttribute("version", MD5(f.FullName));
root.AppendChild(child);
}
}
这样就能简单的判断文件是否被修改过了
缺点:并不能真的判定文件没被修改,但是不会每个文件点击生成xml的时候生成不一样的哈希值。只有在dll重新编译的时候哈希值才可能会发生变化。
最新文章
- javascript 设置input框只读属性 获取disabled后的值并传给后台
- 树莓派Odroid等卡片式电脑上搭建NAS教程系列6-miniDLNA
- FreeMark学习(一)
- libxml2 移植 arm9
- IBM V7000
- java7新特性 java8新特性
- [企业级linux安全管理]- 安全管理基础(1)
- 具体解释coredump
- 使用JQUERY操作Radio
- nyoj_253:LK的旅行(旋转卡壳入门)
- [js] 实现接口
- SQL&;SQLite
- java.lang.ClassNotFoundException: com.radiadesign.catalina.session.RedisSessionHandlerValve
- Linux内核中Makefile、Kconfig和.config的关系(转)
- 解决 nginx 出现 413 Request Entity Too Large 的问题
- VSTO:使用C#开发Excel、Word【7】
- SpringBoot 集成Spring security
- video.js 应用于网站需要视频的
- 20155313 实验二《Java面向对象程序设计》实验报告
- ANR android