当前位置: 首页 > 知识库问答 >
问题:

计算MD5和SHA1校验和时的IOException[重复]

昌乐
2023-03-14

我在执行一个为给定文件计算MD5和SHA1校验和的方法时遇到一个问题。我的方法如下所示:
SHA1:

    public string HashFile(string toHash)
    {
        SHA1 SHA1ENGINE = SHA1.Create();
        byte[] hashBytes = SHA1ENGINE.ComputeHash(File.Open(toHash, FileMode.Open, FileAccess.Read));

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < hashBytes.Length; i++)
        {
            sb.Append(hashBytes[i].ToString("X2"));
        }
        return sb.ToString();
    }


MD5:

    public string HashFile(string toHash)
    {
        MD5 MD5ENGINE = MD5.Create();
        byte[] hashBytes = MD5ENGINE.ComputeHash(File.Open(toHash, FileMode.Open, FileAccess.Read));

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < hashBytes.Length; i++)
        {
            sb.Append(hashBytes[i].ToString("X2"));
        }
        return sb.ToString();
    }


在执行其中一个方法时,我得到一个IOException:进程无法访问文件“(PATHTOFILE),因为另一个进程正在使用它。
这是一个持续存在的问题,我无法计算PC上任何文件的校验和。我以本地管理员身份登录,而VS以管理员身份打开。这对于我尝试过的任何目录都是持久的,例如:C:\temp、C:\users\administrator\desktop。我也试过重新启动我的电脑,因为实际上可能有一个进程锁定文件,但这没有帮助。

byte[] hashBytes = SHA1ENGINE.ComputeHash(File.OpenRead(toHash));
byte[] hashBytes = SHA1ENGINE.ComputeHash(File.Open(toHash, FileMode.Open, FileAccess.Read));

这也无济于事。

共有1个答案

闾丘成礼
2023-03-14

你在打开文件而不关闭它。只需单独打开流,就可以在使用语句中关闭它:

MD5 md5 = MD5.Create();
using (var stream = File.Open(...))
{
    var hash = md5.ComputeHash(stream);
    // ...
}

(我还建议分离出“Convert to Hex”代码以避免重复。您甚至可以使用一个方法获取文件名和hashalgorithm以进一步避免重复……)

这将避免您的代码保留打开的文件流,从而阻止代码打开另一个文件流(包括相同的进程)...但这对目前在别处开放的任何flie都没有帮助。如果您不能打开文件读取它,您将无法计算散列。

 类似资料:
  • 我正在使用iTextSharp从PDF文件中读取文本。然而,有些时候我不能提取文本,因为PDF文件只包含图像。我每天下载同样的PDF文件,我想看看PDF是否被修改过。如果无法获得文本和修改日期,那么MD5校验和是判断文件是否已更改的最可靠方法吗? 如果是的话,一些代码示例将会很感激,因为我对密码学没有太多的经验。

  • 问题内容: 我正在为大型视频文件创建MD5校验和。我当前正在使用代码: 但这会创建一个内存缓冲区,并且对于大型视频文件而言并不理想。Swift中是否有一种方法可以计算读取文件流的MD5校验和,从而使内存占用量最小? 问题答案: 您可以分块计算MD5校验和,例如在?中有没有一个MD5库不需要同时输入全部内容?。 这是使用Swift的可能实现(现已针对Swift 5更新) 需要自动释放池来释放所返回的

  • 这些散列密码的方法中,哪一种最安全,最难发现散列冲突? 仅MD5 仅SHA1 通过SHA1MD5

  • 问题内容: 我正在寻找使用Java获取文件的MD5校验和。我真的很惊讶,但是我找不到任何能显示如何获取文件的MD5校验和的东西。 怎么做? 问题答案: 有一个输入流装饰器,因此你可以像往常一样在使用输入流的同时计算摘要,而不必对数据进行额外的传递。

  • 本文向大家介绍C++计算ICMP头的校验和实例,包括了C++计算ICMP头的校验和实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C++计算ICMP头的校验和的方法,分享给大家供大家参考。具体实现代码如下: 希望本文所述对大家的C++程序设计有所帮助。

  • 使用Java /Spring运行Liquibase以对抗Snowflake数据库。第一个部署工作正常,我让Liquibase创建数据库变更日志表和数据库变更日志锁定表。它们被创建、写入并创建数据库对象。 我第二次尝试运行它时,它将获得更改日志锁,但随后会在liquibase中长时间处于静止状态。util:xxxx的计算校验和。然后在5分钟后超时(由于其他配置设置)。如果我删除DatabaseCha