C# 如何获取current.exe的哈希值?

C# 如何获取current.exe的哈希值?,c#,.net,windows,visual-studio,md5,C#,.net,Windows,Visual Studio,Md5,[已解决]:我复制了该文件并在该副本上运行哈希程序 我需要我的应用程序来查找EXE的当前MD5。我可以得到任何文件的MD5。 但是,无论我做什么,我都无法获得文件流来读取打开的EXE。我尝试使用FileOptions。异步,但没有帮助 编辑:我想我不是很清楚。我希望我的应用程序能够自动阅读 编辑到代码: private void GetMd5() { MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); F

[已解决]:我复制了该文件并在该副本上运行哈希程序

我需要我的应用程序来查找EXE的当前MD5。我可以得到任何文件的MD5。 但是,无论我做什么,我都无法获得文件流来读取打开的EXE。我尝试使用FileOptions。异步,但没有帮助

编辑:我想我不是很清楚。我希望我的应用程序能够自动阅读

编辑到代码:

private void GetMd5()
{
    MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();

    FileInfo fi = new FileInfo(Process.GetCurrentProcess().MainModule.FileName);
    FileStream stream = File.Create(Process.GetCurrentProcess().MainModule.FileName, (int)fi.Length, FileOptions.Asynchronous);

    md5.ComputeHash(stream);

    stream.Close();

    string rtrn = "";
    for (int i = 0; i < md5.Hash.Length; i++)
    {
        rtrn += (md5.Hash[i].ToString("x2"));
    }
    MessageBox.Show(rtrn.ToUpper());
}
private void GetMd5()
{
MD5CryptoServiceProvider md5=新的MD5CryptoServiceProvider();
FileInfo fi=新的FileInfo(Process.GetCurrentProcess().MainModule.FileName);
FileStream stream=File.Create(Process.GetCurrentProcess().MainModule.FileName,(int)fi.Length,FileOptions.Asynchronous);
md5.计算哈希(流);
stream.Close();
字符串rtrn=“”;
for(int i=0;i

使用指定的缓冲区创建或覆盖指定的文件 大小、文件选项和文件安全性

我相当肯定那不是你打算做的。大概你想要:


更改:
FileStream-stream=File.Create(path,(int)fi.Length,FileOptions.Asynchronous)
to
FileStream-stream=File.Open(路径,FileMode.Open)

派对有点晚了,但最近我自己也试着这么做。在.NET4.5中,以下内容可以很好地工作,无需制作临时副本。如前所述,如果您可以读取该文件以制作其副本,则可以读取该文件以为其生成哈希

private string GetMD5()
{
    System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
    System.IO.FileStream stream = new System.IO.FileStream(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName, System.IO.FileMode.Open, System.IO.FileAccess.Read);

    md5.ComputeHash(stream);

    stream.Close();

    System.Text.StringBuilder sb = new System.Text.StringBuilder();
    for (int i = 0; i < md5.Hash.Length; i++)
        sb.Append(md5.Hash[i].ToString("x2"));

    return sb.ToString().ToUpperInvariant();
}
私有字符串GetMD5()
{
System.Security.Cryptography.MD5CryptoServiceProvider md5=新的System.Security.Cryptography.MD5CryptoServiceProvider();
System.IO.FileStream stream=new System.IO.FileStream(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName、System.IO.FileMode.Open、System.IO.FileAccess.Read);
md5.计算哈希(流);
stream.Close();
System.Text.StringBuilder sb=新的System.Text.StringBuilder();
for(int i=0;i
因为我尝试了这些答案,发现没有一个答案会改变对exe的每次编辑,或者根本没有改变,所以我找到了一些确实有效的方法

我没有在这里编辑任何代码,所有这些都来自下面的参考页面

参考:


每个测试似乎都输出正确。我建议任何看到这个的人使用这个类或利用它。

如果这个文件已经被另一个进程锁定,那么你就无法打开它。这就是它的工作方式!你确定哪个进程打开了文件吗?应用程序本身。我正在尝试让应用程序自动打开。我认为它不会工作。@AndrewMock:您需要指定一个读取操作(即File.OpenRead)。如果它被锁定了,你阅读应该没有问题,你就是无法更改它。不管怎样。。。这很奇怪。可能有更好的方法来解决您的问题,不管是什么问题。打开自己的执行EXE似乎无法工作,但我以前从未考虑过,所以我不能肯定。您是否考虑过制作EXE的临时副本并对其运行哈希?谢谢!这起作用了。我使用了File.Copy到%temp%并在上面运行了它。真的不需要复制该文件。这应该只是用正确的访问模式打开它的问题。(如果可以复制,就可以阅读。)@AndrewMock你应该接受一个答案,或者写下你自己的答案并接受,以将问题标记为已回答。
private string GetMD5()
{
    System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
    System.IO.FileStream stream = new System.IO.FileStream(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName, System.IO.FileMode.Open, System.IO.FileAccess.Read);

    md5.ComputeHash(stream);

    stream.Close();

    System.Text.StringBuilder sb = new System.Text.StringBuilder();
    for (int i = 0; i < md5.Hash.Length; i++)
        sb.Append(md5.Hash[i].ToString("x2"));

    return sb.ToString().ToUpperInvariant();
}
internal static class ExecutingHash
{
    public static string GetExecutingFileHash()
    {
        return MD5(GetSelfBytes());
    }

    private static string MD5(byte[] input)
    {
        return MD5(ASCIIEncoding.ASCII.GetString(input));
    }

    private static string MD5(string input)
    {
        MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();

        byte[] originalBytes = ASCIIEncoding.Default.GetBytes(input);
        byte[] encodedBytes = md5.ComputeHash(originalBytes);

        return BitConverter.ToString(encodedBytes).Replace("-", "");
    }

    private static byte[] GetSelfBytes()
    {
        string path = Application.ExecutablePath;

        FileStream running = File.OpenRead(path);

        byte[] exeBytes = new byte[running.Length];
        running.Read(exeBytes, 0, exeBytes.Length);

        running.Close();

        return exeBytes;
    }
}