如何正确访问文件以附加文本(MD5hash)?

时间:2014-01-30 10:00:15

标签: c# file md5 streamwriter

我试图在文件关闭后附加文件的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哈希并附加文本而不会出现异常?

3 个答案:

答案 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);

仅在获取哈希时打开文件进行读取:

C# calculate MD5 for opened file?

答案 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添加以下语句;

相关问题