所以我创建了一个加密和解密GUI,允许我将文件加密或解密为新文件。在我的GUI中,我有一个进度条,告诉我在该过程结束前多久。当我加密一个相对较小的文件时,它会相对快速地加密它。但是,当我尝试加密100 MB文件时,速度非常慢!我认为问题出在我的encryptBG_DoWork方法中,我有for循环;我认为这是我编码的方式。问题是,我可以更快地运行该过程,还是这是运行进度条和加密方法的正确方法?
private void btnEncrypt_Click(object sender, EventArgs e)
{
statusLabel1.Text = "Encrypting...";
encryptBG.RunWorkerAsync();
}
private void encryptBG_DoWork(object sender, DoWorkEventArgs e)
{
for (int i=0; i<=100; i++)
{
encryptBG.ReportProgress(i);
if (Rijndael.Checked == true)
{
ed.EncryptFile(filePath.Text, Destination.Text, "1");
}
else if (TripleDES.Checked == true)
{
ed.EncryptFile(filePath.Text, Destination.Text, "2");
}
}
}
private void encryptBG_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar.Value = e.ProgressPercentage;
statusLabel2.Text = "(" + e.ProgressPercentage.ToString() + "%)";
}
private void encryptBG_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
progressBar.Value = 0;
statusLabel2.Text = "";
statusLabel1.Text = "Encryption Completed!";
}
我的加密和解密方法在这里的另一个项目中。
public void EncryptFile(string sInputFile, string sOutputFile, string alg)
{
try
{
PasswordDeriveBytes pdb = new PasswordDeriveBytes(skey, IV);
FileStream fsCrypt = new FileStream(sOutputFile, FileMode.Create);
FileStream fsIn = new FileStream(sInputFile, FileMode.Open);
int data;
if (alg == "1")
{
RijndaelManaged rdProvider = new RijndaelManaged();
CryptoStream cs1 = new CryptoStream(fsCrypt,
rdProvider.CreateEncryptor(pdb.GetBytes(32), pdb.GetBytes(16)),
CryptoStreamMode.Write);
while ((data = fsIn.ReadByte()) != -1)
cs1.WriteByte((byte)data);
cs1.Close();
}
else if (alg == "2")
{
TripleDESCryptoServiceProvider tdProvider = new TripleDESCryptoServiceProvider();
CryptoStream cs2 = new CryptoStream(fsCrypt,
tdProvider.CreateEncryptor(pdb.GetBytes(24), pdb.GetBytes(8)),
CryptoStreamMode.Write);
while ((data = fsIn.ReadByte()) != -1)
cs2.WriteByte((byte)data);
cs2.Close();
}
fsIn.Close();
fsCrypt.Close();
}
catch
{
}
}
答案 0 :(得分:1)
问题是,我可以更快地运行流程,还是这样 正确的方法来运行进度条和我的加密方法?
您对BackgroundWorker.ReportProgress()和ProgressBar的使用对于您正在进行的操作是正确的,即对同一文件进行100次加密并报告每次迭代的进度。
如果您的目标是仅使用加密文件并使用进度条报告进度,则需要更精细的算法来加密文件。例如,将文件吐出到固定大小的块中。使用循环加密每个块并将进度报告为TotalBlocksEncrypted/TotalBlocks
。