我试图在文件关闭后附加文件的MD5哈希值(基于文件的长度)。我是这样做的:
string filePath = "myPath";
string fileName = "myFileName";
File.Delete(filePath + fileName);
if (!File.Exists(filePath + fileName))
{
using (var sw = File.CreateText(filePath + fileName))
{
sw.Write("Stuff to write");
}
}
using (var sw = File.AppendText(filePath + fileName))
{
sw.Write(ctx.GetMD5HashFromFile(filePath, fileName));
}
不幸的是,由于文件未在两个using语句之间正确关闭,因此无效。我收到以下错误:
Unhandled Exception: System.IO.IOException: The process cannot access the file '
[filePath + fileName] because it is being used by another process.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
如何正确计算MD5哈希并附加文本而不会出现异常?
答案 0 :(得分:2)
我的猜测是你在第二段代码中打开文件两次:
using (var sw = File.AppendText(filePath + fileName))
{
sw.Write(ctx.GetMD5HashFromFile(filePath, fileName));
}
ctx.GetMD5HashFromFile
可能会打开文件来创建哈希值;但是你已经打开它来附加数据。因此,请在File.AppendText
using
块之前创建哈希值。
答案 1 :(得分:1)
您没有在创建时关闭文件,请尝试:
if (!File.Exists(filePath))
{
using (var sw = File.CreateText(filePath))
{
sw.Write("Stuff to write");
}
}
FileStream file = File.OpenRead(filePath);
string hashString = ctx.GetMD5HashFromFile(file);
file.Close();
File.WriteAllText(filePath, hashString);
仅在获取哈希时打开文件进行读取:
答案 2 :(得分:0)
我建议使用Sha1Sum代替MD5,这是非常古老且不安全的
此函数以“C61211674FD03175FEC87A9C01F39F72376CE104”格式返回值
public static string MakeSha(string Mystr)
{
SHA1CryptoServiceProvider Crpyt = new SHA1CryptoServiceProvider();
byte[] buf = ASCIIEncoding.ASCII.GetBytes(Mystr);
return BitConverter.ToString(Crpyt.ComputeHash(buf)).Replace("-", "").ToUpper();
}
PS:不要忘记使用System.Security.Cryptography添加以下语句;