一個(gè)簡(jiǎn)單的文件MD5碼自動(dòng)計(jì)算比較器(附源碼)
更新時(shí)間:2013年02月22日 13:12:35 作者:
一直在玩 WOW ,發(fā)現(xiàn)網(wǎng)上的 MD5 計(jì)算工具都沒有自動(dòng)比較功能,每次下載更新計(jì)算后,都要自己一個(gè)一個(gè)字母核對(duì),比較麻煩。
最近開始學(xué)習(xí) C# ,用 .NET ,做了一個(gè)簡(jiǎn)單的文件MD5碼自動(dòng)計(jì)算比較器。
主要對(duì) 多線程更新 winform 不是特別清楚,繞來繞去,搞得很暈乎,主要代碼如下, 還請(qǐng)各位大俠多多指點(diǎn),謝謝!
復(fù)制代碼 代碼如下:
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 = "請(qǐng)選擇文件";
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 = "請(qǐng)先重新選擇文件!";
return;
}
FileStream fs = null;
try {
fs = new FileStream(file, FileMode.Open, FileAccess.Read);
} catch (SystemException) {
textBox_result.Text = "文件打開錯(cuò)誤,請(qǐng)重新選擇文件!";
return;
}
//對(duì)于大于 100M 的文件啟用多線程
if (fs.Length > 100L * 1024 * 1024) {
string message = "文件已經(jīng)超過 100M ,需要較長(zhǎng)的計(jì)算時(shí)間。\n軟件將啟動(dòng)后臺(tái)線程進(jìn)行處理。是否繼續(xù)?";
string caption = "文件較大";
MessageBoxButtons buttons = MessageBoxButtons.YesNo;
if (MessageBox.Show(message, caption, buttons) == System.Windows.Forms.DialogResult.No) {
fs.Close();
textBox_result.Text = "文件較大,未計(jì)算。";
return;
}
textBox_result.Text = "正在計(jì)算中,請(qǐng)稍候......";
button_calc.Enabled = false;
button_file.Enabled = false;
Thread thread = new Thread(new ParameterizedThreadStart(calcMD5));
thread.Start(fs);
} else {
calcMD5(fs);
}
}
//建立一個(gè) object 參數(shù)的函數(shù),是為了處理線程調(diào)用中,使用參數(shù)的問題。
private void calcMD5(object fs) {
calcMD5((FileStream)fs);
}
// Invoke 函數(shù)需要使用的委托
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 = "計(jì)算結(jié)果框中不是MD5碼,請(qǐng)先進(jìn)行計(jì)算!";
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碼 不匹配,文件已被修改,請(qǐng)小心!";
}
}
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}字節(jié) )", d_size, unit, size);
}
}
}
完整的 VS2010 項(xiàng)目下載:http://xiazai.jb51.net/201302/yuanma/FileMD5_jb51.net.rar
相關(guān)文章
asp.net 1.1/ 2.0 中快速實(shí)現(xiàn)單點(diǎn)登陸
asp.net 1.1/ 2.0 中快速實(shí)現(xiàn)單點(diǎn)登陸...2007-04-04GridView導(dǎo)出Excel實(shí)現(xiàn)原理與代碼
使用GridView來展示數(shù)據(jù)庫(kù)表,幾乎沒對(duì)GridView的格式做什么設(shè)定,從配置文件中加載SQL,跑出數(shù)據(jù)就直接綁定到GridView,接下來介紹導(dǎo)出Excel的功能感興趣的朋友可以參考下2013-01-01ASP.NET Core中如何利用Csp標(biāo)頭對(duì)抗Xss攻擊
這篇文章主要給大家介紹了關(guān)于ASP.NET Core中如何利用Csp標(biāo)頭對(duì)抗Xss攻擊的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用ASP.NET Core具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09asp.net使用DataSet的ReadXml讀取XML文件及Stream流的方法
這篇文章主要介紹了asp.net使用DataSet的ReadXml讀取XML文件及Stream流的方法,實(shí)例分析了asp.net以字符流的形式讀取與寫入xml文件的相關(guān)技巧,需要的朋友可以參考下2016-06-06