一个简单的文件MD5码自动计算比较器(附源码)_asp.net教程-查字典教程网
一个简单的文件MD5码自动计算比较器(附源码)
一个简单的文件MD5码自动计算比较器(附源码)
发布时间:2016-12-29 来源:查字典编辑
摘要:主要对多线程更新winform不是特别清楚,绕来绕去,搞得很晕乎,主要代码如下,还请各位大侠多多指点,谢谢!复制代码代码如下:usingSy...

主要对 多线程更新 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教程学习
    热门asp.net教程学习
    编程开发子分类