华域联盟 .Net 一个简单的文件MD5码自动计算比较器(附源码)

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

主要对 多线程更新 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

本文由 华域联盟 原创撰写:华域联盟 » 一个简单的文件MD5码自动计算比较器(附源码)

转载请保留出处和原文链接:https://www.cnhackhy.com/47634.htm

本文来自网络,不代表华域联盟立场,转载请注明出处。

作者: sterben

发表回复

联系我们

联系我们

2551209778

在线咨询: QQ交谈

邮箱: [email protected]

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部