一个简单的文件MD5码自动计算比较器(附源码)

所属分类: 网络编程 / ASP.NET 阅读数: 1438
收藏 0 赞 0 分享

主要对 多线程更新 winform 不是特别清楚,绕来绕去,搞得很晕乎,主要代码如下, 还请各位大侠多多指点,谢谢!

复制代码 代码如下:

using System;
 using System.Collections.Generic;
 using System.ComponentModel;
 using System.Data;
 using System.Drawing;
 using System.Linq;
 using System.Text;
 using System.Windows.Forms;
 using System.Security.Cryptography;
 using System.IO;
 using System.Threading;

 namespace FileMD5 {
     public partial class MainForm : Form {
         public MainForm() {
             InitializeComponent();
         }

         private void button_file_Click(object sender, EventArgs e) {
             OpenFileDialog fileDialog = new OpenFileDialog();
             fileDialog.Title = "请选择文件";
             fileDialog.RestoreDirectory = true;

             if (fileDialog.ShowDialog() == DialogResult.OK) {
                 textBox_file.Text = fileDialog.FileName;
                 textBox_result.Text = "";
                 FileInfo file = new FileInfo(fileDialog.FileName);
                 fileSzie = file.Length;
                 showFilesize(fileSzie);
             }

         }

         private void button_exit_Click(object sender, EventArgs e) {
             this.Close();
             this.Dispose();
         }

         private void button_check_Click(object sender, EventArgs e) {
             checkResult();
         }

         MD5 md5 = (MD5)CryptoConfig.CreateFromName("MD5");
         long fileSzie = 0;

         private void button_calc_Click(object sender, EventArgs e) {
             string file = textBox_file.Text;

             if (file.Length == 0) {
                 textBox_result.Text = "请先重新选择文件!";
                 return;
             }

             FileStream fs = null;
             try {
                 fs = new FileStream(file, FileMode.Open, FileAccess.Read);
             } catch (SystemException) {
                 textBox_result.Text = "文件打开错误,请重新选择文件!";
                 return;
             }

             //对于大于 100M 的文件启用多线程
             if (fs.Length > 100L * 1024 * 1024) {

                 string message = "文件已经超过 100M ,需要较长的计算时间。\n软件将启动后台线程进行处理。是否继续?";
                 string caption = "文件较大";
                 MessageBoxButtons buttons = MessageBoxButtons.YesNo;

                 if (MessageBox.Show(message, caption, buttons) == System.Windows.Forms.DialogResult.No) {
                     fs.Close();
                     textBox_result.Text = "文件较大,未计算。";
                     return;
                 }
                 textBox_result.Text = "正在计算中,请稍候......";
                 button_calc.Enabled = false;
                 button_file.Enabled = false;

                 Thread thread = new Thread(new ParameterizedThreadStart(calcMD5));
                 thread.Start(fs);

             } else {
                 calcMD5(fs);
             }
         }

         //建立一个 object 参数的函数,是为了处理线程调用中,使用参数的问题。
         private void calcMD5(object fs) {
             calcMD5((FileStream)fs);
         }

         // Invoke 函数需要使用的委托
         delegate void updateWindows(byte[] result);

         private void calcMD5(FileStream fs) {
             byte[] md5byte = md5.ComputeHash(fs);

             if (this.InvokeRequired) {
                 this.Invoke(new updateWindows(showResult), md5byte);
             } else {
                 showResult(md5byte);
             }
             fs.Close();
         }

         private void showResult(byte[] md5byte) {
             int i, j;
             StringBuilder sb = new StringBuilder(32);
             foreach (byte b in md5byte) {
                 i = Convert.ToInt32(b);
                 j = i >> 4;
                 sb.Append(Convert.ToString(j, 16));
                 j = ((i << 4) & 0x00ff) >> 4;
                 sb.Append(Convert.ToString(j, 16));
             }

             String result = sb.ToString().ToUpper();

             textBox_result.Text = result;
             button_calc.Enabled = true;
             button_file.Enabled = true;
             checkResult();

         }

         private void checkResult() {

             string result = textBox_result.Text;

             if (textBox_md5.Text.Length == 0) {
                 textBox_compare.Text = "";
                 textBox_compare.Visible = false;
                 return;
             }

             if(result.Length != 32 ) {
                 textBox_compare.Visible = true;
                 textBox_compare.BackColor = Color.Pink;
                 textBox_compare.Text = "计算结果框中不是MD5码,请先进行计算!";
                 return;
             }

             if (textBox_md5.Text.Trim().ToUpper().Equals(result.ToUpper())) {
                 textBox_compare.Visible = true;
                 textBox_compare.BackColor = Color.LightGreen;
                 textBox_compare.Text = "MD5码 已匹配,文件未被修改,可放心使用!";
             } else {
                 textBox_compare.Visible = true;
                 textBox_compare.BackColor = Color.Red;
                 textBox_compare.Text = "MD5码 不匹配,文件已被修改,请小心!";
             }
         }

         private void showFilesize(long size) {

             float d_size;
             string unit = "Byte";

             if (size > 1024 * 1024 * 1024) {    //大于 1G 的显示
                 d_size = size / (float)(1024 * 1024 * 1024);
                 unit = "GB";
             } else {
                 if (size > 1024 * 1024) {    //大于 1M 的显示
                     d_size = size / (float)(1024 * 1024);
                     unit = "MB";
                 } else {
                     if (size > 1024) {    //大于 1K 的显示
                         d_size = size / (float)(1024);
                         unit = "KB";
                     } else {
                         d_size = size;
                     }
                 }
             }
             textBox_filesize.Text = string.Format(" {0:F} {1} ( {2:N0}字节 )", d_size, unit, size);
         }
     }
 }

完整的 VS2010 项目下载:http://xiazai.jb51.net/201302/yuanma/FileMD5_jb51.net.rar

更多精彩内容其他人还在看

ASP.Net 之Datalist删除功能详解附代码

ASP.Net 之Datalist删除功能详解附代码,需要的朋友可以参考一下
收藏 0 赞 0 分享

ASP.NET(C#)验证数字的两种方法

ASP.NET(C#)验证数字的两种方法,需要的朋友可以参考一下
收藏 0 赞 0 分享

此页的状态信息无效,可能已损坏 的处理办法及原因分析

此页的状态信息无效,可能已损坏 的处理办法及原因分析,需要的朋友可以参考一下
收藏 0 赞 0 分享

MultiLine 换行后实现读取不换行的具体思路

输入内容中有换行,保存到数据库,直接查看感觉没有换行,但查询结果“以文本格式显示结果”你就会发现 其实是有换行的,下面与大家分享下具体的解决方法
收藏 0 赞 0 分享

swfupload ajax无刷新上传图片实例代码

在这里上传图片就需要用到ajax无刷新上传图片,这里面包含的东西不是一点半点。这里用到的是一个插件swfupload实现无刷新上传图片,感兴趣的朋友可以参考下哈
收藏 0 赞 0 分享

静态gb2312编码在项目传值出现中文乱码现象

参考的美工静态页面是gb2312格式的,当此编码拿到项目中后,utf-8编码的系统,加载页面时,会出现样式问题,比如不能正常居中等
收藏 0 赞 0 分享

System.Timers.Timer定时执行程序示例代码

如果是某个逻辑功能的定时,可以将code放到逻辑功能的类的静态构造函数中,在该逻辑类第一次执行时,静态构造函数会被调用,则定时自然启动
收藏 0 赞 0 分享

分享下Asp.Net面试题目及答案集合

这篇文章主要是总结asp.net开发人员在面试过程中常遇到的一些问题小结,需要的朋友可以参考下
收藏 0 赞 0 分享

给自定义Web控件添加事件(前后台代码)

给自定义控件(Web Control)添加事件具体前后台代码如下,感兴趣的朋友可以参考下哈
收藏 0 赞 0 分享

ASP.NET过滤器的应用方法介绍

ASP.NET过滤器的应用方法介绍,需要的朋友可以参考一下
收藏 0 赞 0 分享
查看更多