none
Como identificar se instalador Inno está corrupto? RRS feed

  • Pergunta

  • Olá 

    Gente tenho um atualizador onde faz o download da atualização usando "client.DownloadFileAsync". Mas algumas vezes o download é concluído  mas o arquivo fica corrupto.

    O arquivo baixado é um instalador do Inno Setup, que é instalado automaticamente em silencio após a conclusão do download. Mas a questão é o seguinte, como posso identificar se o arquivo é corrupto? Caso for ele deve ser apagado e baixado novamente, caso não for é instalado.

    Eu executo o arquivo após o download usando NewProcess, mas surge uma mensagem:

    The setup files are corrupted. Please obtain a new copy of the program.

    Essa mensagem é exibida com ou sem o tratamento de erros ("Try").

    Não sei como resolver, alguém pode me ajudar?

    Desde já agradeço.


    • Editado Eliseu5 quinta-feira, 17 de novembro de 2016 12:39
    segunda-feira, 7 de novembro de 2016 16:51

Respostas

  • Olá Eliseu!

    O problema provavelmente está acontecendo porque você está comparando strings com o operador "=".. Isso normalmente acaba retornando resultados inesperados.. Eu utilizaria uma chamada para Enumerable.SequenceEqual comparando diretamente os dois byte arrays..

    Exemplo em C#:

            static void Main(string[] args)
            {
                var hash1 = GetHash(@"C:\Users\jamje\Desktop\SkypeSetup.exe");
                var hash2 = GetHash(@"C:\Users\jamje\Desktop\New Folder (2)\SkypeSetup.exe");
                var hash3 = GetHash(@"C:\Users\jamje\Desktop\New Folder (2)\SkypeSetup2.exe");
    
                Console.WriteLine("Hash1 = Hash2 => " + Enumerable.SequenceEqual(hash1, hash2).ToString());
                Console.WriteLine("Hash1 = Hash3 => " + Enumerable.SequenceEqual(hash1, hash3).ToString());
                Console.WriteLine("Hash2 = Hash3 => " + Enumerable.SequenceEqual(hash2, hash3).ToString());
                Console.ReadLine();
            }
    
            private static byte[] GetHash(string fileName)
            {
                using (var md5 = System.Security.Cryptography.MD5.Create())
                {
                    using (var stream = System.IO.File.OpenRead(fileName))
                    {
                        return md5.ComputeHash(stream);
                    }
                }
            }

    Exemplo em VB.NET:

        Sub Main()
            Dim Hash1 = GetHash("C:\Users\jamje\Desktop\SkypeSetup.exe")
            Dim Hash2 = GetHash("C:\Users\jamje\Desktop\New Folder (2)\SkypeSetup.exe")
            Dim Hash3 = GetHash("C:\Users\jamje\Desktop\New Folder (2)\SkypeSetup2.exe")
    
            Console.WriteLine("Hash1 = Hash2 => " + Enumerable.SequenceEqual(Hash1, Hash2).ToString())
            Console.WriteLine("Hash1 = Hash3 => " + Enumerable.SequenceEqual(Hash1, Hash3).ToString())
            Console.WriteLine("Hash2 = Hash3 => " + Enumerable.SequenceEqual(Hash2, Hash3).ToString())
            Console.ReadLine()
        End Sub
    
        Private Function GetHash(FileName As String) As Byte()
            Using Md5 = System.Security.Cryptography.MD5.Create()
                Using Stream = System.IO.File.OpenRead(FileName)
                    Return Md5.ComputeHash(Stream)
                End Using
            End Using
        End Function

    Resultado:

    Abraço!


    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima

    terça-feira, 15 de novembro de 2016 04:44
    Moderador

Todas as Respostas

  • Bom dia Eliseu5,

    De acordo com o link abaixo, essa mensagem de erro ocorre quando um arquivo tem o tamanho errado. Talvez você possa tentar fazer uma verificação do tamanho do arquivo para saber se está corrompido ou não.

    http://www.jrsoftware.org/isfaq.php#corrupt

    Atenciosamente,


    Robson William Silva

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    terça-feira, 8 de novembro de 2016 12:53
    Moderador
  • Olá Eliseu!

    Normalmente o método de verificação mais utilizado para saber se um arquivo baixado está corrompido ou não é através do hash do arquivo.. Basicamente você precisaria armazenar o hash do arquivo no servidor e, depois de baixar o arquivo no cliente, você calcula o hash novamente e compara para ver se o hash está idêntico ao armazenado no servidor..

    Para saber mais sobre o cálculo de hashes de arquivos, veja estes links (são para C#, mas, você pode converter facilmente para VB.NET com algum conversor como este):

    Calculate MD5 checksum for a file

    How to calculate a CRC in C#

    Abraço!


    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima

    • Sugerido como Resposta Eduardo xUni quarta-feira, 16 de novembro de 2016 16:46
    terça-feira, 8 de novembro de 2016 14:21
    Moderador
  • Olá Robson, 

    Boa ideia, no entanto não consegui extrair o tamanho do arquivo original que encontra-se online para poder comparar. Tentei alguns códigos que encontrei mas não deu certo.

    terça-feira, 8 de novembro de 2016 19:33
  • Olá Andre

    Dei uma estudada sobre o Hash, testei o código a baixo com o mesmo arquivo, apenas copiado e colado:

      Dim valor, valor2 As String
            Dim md6 = MD5.Create()
            Dim stream = File.OpenRead("C:\\win32.exe")
            valor = BitConverter.ToString(md6.ComputeHash(stream)).Replace("-", "‌​").ToLower()
    
            Dim stream2 = File.OpenRead("C:\\win32_2.exe")
            valor2 = BitConverter.ToString(md6.ComputeHash(stream)).Replace("-", "‌​").ToLower()
            MsgBox(valor & vbCrLf & valor2 & vbCrLf & If(valor2 = valor, "Igual", "Diferente"))

    O valor retornado deu diferente, mesmo sendo o mesmo arquivo. Não entendi direito como funciona. pois um simples copiar e colar arquivo já o torna diferente.

    Baixei o arquivo duas vezes e comparei os dois baixados, mas mesmo assim não deu certo.
    • Editado Eliseu5 terça-feira, 8 de novembro de 2016 20:15
    terça-feira, 8 de novembro de 2016 19:55
  • Olá Eliseu!

    O problema provavelmente está acontecendo porque você está comparando strings com o operador "=".. Isso normalmente acaba retornando resultados inesperados.. Eu utilizaria uma chamada para Enumerable.SequenceEqual comparando diretamente os dois byte arrays..

    Exemplo em C#:

            static void Main(string[] args)
            {
                var hash1 = GetHash(@"C:\Users\jamje\Desktop\SkypeSetup.exe");
                var hash2 = GetHash(@"C:\Users\jamje\Desktop\New Folder (2)\SkypeSetup.exe");
                var hash3 = GetHash(@"C:\Users\jamje\Desktop\New Folder (2)\SkypeSetup2.exe");
    
                Console.WriteLine("Hash1 = Hash2 => " + Enumerable.SequenceEqual(hash1, hash2).ToString());
                Console.WriteLine("Hash1 = Hash3 => " + Enumerable.SequenceEqual(hash1, hash3).ToString());
                Console.WriteLine("Hash2 = Hash3 => " + Enumerable.SequenceEqual(hash2, hash3).ToString());
                Console.ReadLine();
            }
    
            private static byte[] GetHash(string fileName)
            {
                using (var md5 = System.Security.Cryptography.MD5.Create())
                {
                    using (var stream = System.IO.File.OpenRead(fileName))
                    {
                        return md5.ComputeHash(stream);
                    }
                }
            }

    Exemplo em VB.NET:

        Sub Main()
            Dim Hash1 = GetHash("C:\Users\jamje\Desktop\SkypeSetup.exe")
            Dim Hash2 = GetHash("C:\Users\jamje\Desktop\New Folder (2)\SkypeSetup.exe")
            Dim Hash3 = GetHash("C:\Users\jamje\Desktop\New Folder (2)\SkypeSetup2.exe")
    
            Console.WriteLine("Hash1 = Hash2 => " + Enumerable.SequenceEqual(Hash1, Hash2).ToString())
            Console.WriteLine("Hash1 = Hash3 => " + Enumerable.SequenceEqual(Hash1, Hash3).ToString())
            Console.WriteLine("Hash2 = Hash3 => " + Enumerable.SequenceEqual(Hash2, Hash3).ToString())
            Console.ReadLine()
        End Sub
    
        Private Function GetHash(FileName As String) As Byte()
            Using Md5 = System.Security.Cryptography.MD5.Create()
                Using Stream = System.IO.File.OpenRead(FileName)
                    Return Md5.ComputeHash(Stream)
                End Using
            End Using
        End Function

    Resultado:

    Abraço!


    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima

    terça-feira, 15 de novembro de 2016 04:44
    Moderador
  • Bom dia,

    Devido a falta de interação do autor dessa pergunta,

    essa thread está sendo fechada. Caso o problema ainda

    esteja ocorrendo, favor abrir uma nova thread.

    Atenciosamente,


    Robson William Silva

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    quinta-feira, 17 de novembro de 2016 12:07
    Moderador
  • Fala pessoal!

    Só para deixar documentado aqui, baseando na resposta que eu dei para essa pergunta, na semana passada eu publiquei um artigo detalhando o cálculo de hashes de arquivos utilizando o algoritmo MD5 e SHA, bem como a comparação do hash de dois arquivos para validar se eles são idênticos.. Confira o resultado aqui:

    Calculando o hash de arquivos para verificação de integridade com C# e VB.NET

    Abraço!


    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima

    segunda-feira, 3 de abril de 2017 03:30
    Moderador