接前两篇继续:

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重新编译的时候哈希值才可能会发生变化。

最新文章

  1. javascript 设置input框只读属性 获取disabled后的值并传给后台
  2. 树莓派Odroid等卡片式电脑上搭建NAS教程系列6-miniDLNA
  3. FreeMark学习(一)
  4. libxml2 移植 arm9
  5. IBM V7000
  6. java7新特性 java8新特性
  7. [企业级linux安全管理]- 安全管理基础(1)
  8. 具体解释coredump
  9. 使用JQUERY操作Radio
  10. nyoj_253:LK的旅行(旋转卡壳入门)
  11. [js] 实现接口
  12. SQL&amp;SQLite
  13. java.lang.ClassNotFoundException: com.radiadesign.catalina.session.RedisSessionHandlerValve
  14. Linux内核中Makefile、Kconfig和.config的关系(转)
  15. 解决 nginx 出现 413 Request Entity Too Large 的问题
  16. VSTO:使用C#开发Excel、Word【7】
  17. SpringBoot 集成Spring security
  18. video.js 应用于网站需要视频的
  19. 20155313 实验二《Java面向对象程序设计》实验报告
  20. ANR android

热门文章

  1. HIVE 启动出错总结
  2. Python自动化 【第十篇】:Python进阶-多进程/协程/事件驱动与Select\Poll\Epoll异步IO
  3. Bootstrap修改input file默认样式
  4. oracle net manager的配置文件tnsnames.ora位置
  5. win10开始菜单打不开怎么办 win菜单键没反应解决办法
  6. HDOJ(1728)逃离迷宫
  7. js 模块开发之一(模块开发价值)
  8. redis配置认证密码
  9. DrawingControl控件在Add Page时报故障的问题
  10. ffmpeg未整理好,有时间整理下