我的应用程序的一部分希望能够散列用户指定的文件,但我仍然坚持实际的代码本身。请注意:
filepath512(.text)
=用户插入文件路径的文本框
fileout(.text)
=输出文本框
button21_click
=“哈希/确认”按钮用于启动哈希算法
当我运行应用程序并运行散列算法时,没有任何反应(结果不会出现在“输出”文本框中)。 几个星期前,我实际上用相同的代码(好的,相同的结构)成功地执行了散列算法,并且它运行得非常好! 我刚刚开始使用C#,所以请原谅任何凌乱的代码!
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
string filePath = e.Argument.ToString();
byte[] buffer;
int bytesRead;
long size;
long totalBytesRead = 0;
using (Stream file = File.OpenRead(filePath))
{
size = file.Length;
using (HashAlgorithm hasher = SHA512.Create())
{
do
{
buffer = new byte[4096];
bytesRead = file.Read(buffer, 0, buffer.Length);
totalBytesRead += bytesRead;
hasher.TransformBlock(buffer, 0, bytesRead, null, 0);
backgroundWorker1.ReportProgress((int)((double)totalBytesRead / size * 100));
}
while (bytesRead != 0);
hasher.TransformFinalBlock(buffer, 0, 0);
e.Result = MakeHashString(hasher.Hash);
}
}
}
private static string MakeHashString(byte[] hashbytes)
{
StringBuilder hash = new StringBuilder(32);
foreach (byte b in hashbytes)
hash.Append(b.ToString("X2").ToLower());
return hash.ToString();
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar3.Value = e.ProgressPercentage;
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
fileout512.Text = e.Result.ToString();
progressBar3.Value = 0;
}
private void button21_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync(filepath512.Text);
}
答案 0 :(得分:1)
实际上,您的代码错过了很多健全性检查。首先,您应该使用OpenFileDialog
而不是直接用户输入来指定路径。其次,一旦流程开始,你应该使用File.Exists
方法确保文件存在...如果它没有,你应该返回一个合适的结果。
您的代码可能会在某处抛出异常。来自官方MSDN documentation:
如果操作成功完成并且其结果已分配 DoWork事件处理程序,您可以通过访问结果 RunWorkerCompletedEventArgs.Result属性。
[...]
您的RunWorkerCompleted事件处理程序应始终检查错误 访问Result属性前已取消和已取消的属性。如果 异常被提出或如果操作被取消,访问 Result属性引发异常。
因此,请使用事件参数的Error
属性检查错误详细信息,以确保您的代码在没有异常的情况下正确执行。如果是这种情况,您必须修复代码,以便散列不再失败。
答案 1 :(得分:0)
文件存在吗?您必须在尝试执行操作之前检查文件是否存在。调试文件路径并查看它是否存在,并且它具有读权限。