none
DESCOMPACTAR ARQUIVO .RAR (WINRAR) RRS feed

  • Pergunta

  • Boa noite amigos,

    Preciso de uma maneira de descompacta arquivo .RAR. Descompactar arquivo .ZIP eu consigo através do Ionic, porém o arquivo que preciso baixar, estando em formato .ZIP fica maior do que .RAR. 

    Tem alguma maneira alternativa que eu consiga extrair como .rar? 

    Agradeço desde já!

    //Referência
    using Ionic.Zip
    
                    using (ZipFile zip1 = ZipFile.Read(arquivoZIP))
                    {
                        foreach (ZipEntry eZip in zip1)
                        {
                            eZip.Extract(destinoZIP, ExtractExistingFileAction.OverwriteSilently);
                        }
                    }

    quarta-feira, 5 de outubro de 2016 00:41

Respostas

  • Olá,

    Pode fazer assim:

            public void ExtrairRAR()
            {
                RarArchive archive = RarArchive.Open(Application.StartupPath + @"\Data\updatetemp\UP_update.rar");
                foreach (RarArchiveEntry entry in archive.Entries)
                {
                    try
                    {
                        string fileName = Path.GetFileName(entry.FilePath);
                        string rootToFile = Application.StartupPath + @"\extract-temp" + (Path.GetFullPath(entry.FilePath).Replace(fileName, "").Replace(Application.StartupPath, ""));
    
                        if (!Directory.Exists(rootToFile))
                        {
                            Directory.CreateDirectory(rootToFile);
                        }
    
                        entry.WriteToFile(rootToFile + fileName, ExtractOptions.ExtractFullPath | ExtractOptions.Overwrite);
                    }
                    catch (Exception ex)
                    {
                    }
                }
            }

    Valeu!


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco

    quinta-feira, 6 de outubro de 2016 14:34
  • Guilherme,

    Funcionou perfeitamente aqui.

    Desconfio que pode ser o tamanho do caminho criado. Lembre-se o windows ainda tem um limite de 256 caracteres.

    Vou dar um exemplo para entender o que é esse "caminho":

    C:\temp\Pasta123456 = Esse caminho tem 19 caracteres.

    Então, caso o caminho total ultrapassar 256 você vai começar a ter problemas para acessar, o que pode ser o seu caso.

    Entendeu?


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco

    quinta-feira, 6 de outubro de 2016 20:04

Todas as Respostas

  • Olá,

    Tenta utilizar esse aqui para implementar:

    http://nunrar.codeplex.com/

    Valeu!


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco

    quarta-feira, 5 de outubro de 2016 11:16
  • André, tentei mas não consegui sucesso, vi o código, adicionei a referência, porém não consigo realizar o procedimento.

    Teria um exemplo de como extrair um arquivo no formato .RAR? 

    Obrigado desde já! 

    quarta-feira, 5 de outubro de 2016 17:56
  • Olha essa thread tem um exemplo: http://stackoverflow.com/questions/13087751/unrar-file-with-subdirectory

    Valeu!


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco

    quarta-feira, 5 de outubro de 2016 19:19
  • public void ExtrairRAR()
            {
                RarArchive archive = RarArchive.Open(Application.StartupPath + @"\Data\updatetemp\UP_update.rar");
                foreach (RarArchiveEntry entry in archive.Entries)
                {
                    try
                    {
                        string fileName = Path.GetFileName(entry.FilePath);
                        string rootToFile = Path.GetFullPath(entry.FilePath).Replace(fileName, "");
    
                        if (!Directory.Exists(rootToFile))
                        {
                            Directory.CreateDirectory(rootToFile);
                        }
    
                        entry.WriteToFile(rootToFile + fileName, ExtractOptions.ExtractFullPath | ExtractOptions.Overwrite);
                    }
                    catch(Exception ex)
                    {
                        txtLog.BeginInvoke((MethodInvoker)delegate { txtLog.Text = ex.Message; });
                    }
                }
            }

    Amigo, fiz como no exemplo que me passou, porém ainda não consegui sucesso. O que posso fazer nesse código?

    Preciso criar uma pasta temporária (extract-temp) e mandar os arquivos pra ela, como posso fazer ? 

    Obrigado desde já.

    quinta-feira, 6 de outubro de 2016 12:34
  • Olá,

    Algumas considerações:

    * Segundo esse código, o seu arquivo RAR tem que estar dentro da mesma pasta que seu .exe do projeto foi criado (Se estiver rodando em modo Debug vai ser a pasta \bin\Debug, se estiver em modo Release vai ser \bin\Release)

    * Abaixo eu adaptei o código para criar uma pasta extract-temp na mesma pasta do projeto e descompactar o arquivo lá. Segue o código:

            public void ExtrairRAR()
            {
                RarArchive archive = RarArchive.Open(Application.StartupPath + @"\Data\updatetemp\UP_update.rar");
                foreach (RarArchiveEntry entry in archive.Entries)
                {
                    try
                    {
                        string fileName = Path.GetFileName(entry.FilePath);
                        string rootToFile = Path.GetFullPath(entry.FilePath).Replace(fileName, "") + @"extract-temp\";
    
                        if (!Directory.Exists(rootToFile))
                        {
                            Directory.CreateDirectory(rootToFile);
                        }
    
                        entry.WriteToFile(rootToFile + fileName, ExtractOptions.ExtractFullPath | ExtractOptions.Overwrite);
                    }
                    catch (Exception ex)
                    {
                    }
                }
            }

    Valeu!


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco

    quinta-feira, 6 de outubro de 2016 13:20
  • Boa André!!!!!!!!!!!!!! Consegui amigo, porém dentro do arquivo .RAR tem uma subpasta chamado (d.files\), preciso enviar essa subpasta para o diretório temp também, ela está sendo extraída na raiz do debug! :D

    Como faço amigo? 

    quinta-feira, 6 de outubro de 2016 13:53
  • Olá,

    Pode fazer assim:

            public void ExtrairRAR()
            {
                RarArchive archive = RarArchive.Open(Application.StartupPath + @"\Data\updatetemp\UP_update.rar");
                foreach (RarArchiveEntry entry in archive.Entries)
                {
                    try
                    {
                        string fileName = Path.GetFileName(entry.FilePath);
                        string rootToFile = Application.StartupPath + @"\extract-temp" + (Path.GetFullPath(entry.FilePath).Replace(fileName, "").Replace(Application.StartupPath, ""));
    
                        if (!Directory.Exists(rootToFile))
                        {
                            Directory.CreateDirectory(rootToFile);
                        }
    
                        entry.WriteToFile(rootToFile + fileName, ExtractOptions.ExtractFullPath | ExtractOptions.Overwrite);
                    }
                    catch (Exception ex)
                    {
                    }
                }
            }

    Valeu!


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco

    quinta-feira, 6 de outubro de 2016 14:34
  • André, novamente, consecutivamente, muito obrigado pela sua ajuda! tenha um ótimo dia! 

    Att,

    Guilherme.

    quinta-feira, 6 de outubro de 2016 14:43
  • André, deu certo, porém está me retornando um exception, :

    try
                {
                    RarArchive archive = RarArchive.Open(Application.StartupPath + @"\Data\update_temp\UP_update.rar");
                    foreach (RarArchiveEntry entry in archive.Entries)
                    {
                        try
                        {
                            string fileName = Path.GetFileName(entry.FilePath);
                            string rootToFile = Application.StartupPath + @"\Data\update_temp\extract_update" +
                            (Path.GetFullPath(entry.FilePath).Replace(fileName, "").Replace(Application.StartupPath, ""));
    
                            if (!Directory.Exists(rootToFile))
                            { Directory.CreateDirectory(rootToFile); }
                            entry.WriteToFile(rootToFile + fileName, ExtractOptions.ExtractFullPath | ExtractOptions.Overwrite);
                        }
                        catch (Exception ex)
                        { txtLog.BeginInvoke((MethodInvoker)delegate { txtLog.Text = ex.Message; }); }
                    }
                }
                catch (Exception ex)
                {
                    txtLog.BeginInvoke((MethodInvoker)delegate 
                    { 
                        txtLog.Text = ex.Message;
                    });
                    MessageBox.Show("Não foi encontrado o arquivo de atualização.", "Aviso do Sistema",
                        MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
            }

    Como posso proceder ? 

    quinta-feira, 6 de outubro de 2016 16:20
  • Em qual linha está acusando o erro?

    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco

    quinta-feira, 6 de outubro de 2016 16:43
  •                 RarArchive archive = RarArchive.Open(Application.StartupPath + @"\Data\update_temp\UP_update.rar");
                    foreach (RarArchiveEntry entry in archive.Entries)
                    {
                        try
                        {
                            string fileName = Path.GetFileName(entry.FilePath);
                            string rootToFile = Application.StartupPath + @"\Data\update_temp\extract_update" +
                            (Path.GetFullPath(entry.FilePath).Replace(fileName, "").Replace(Application.StartupPath, ""));
    
                            if (!Directory.Exists(rootToFile))
                            { Directory.CreateDirectory(rootToFile); }
                            entry.WriteToFile(rootToFile + fileName, ExtractOptions.ExtractFullPath | ExtractOptions.Overwrite);
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show("PAROU AQUI"); //PAROU AQUI
                            txtLog.BeginInvoke((MethodInvoker)delegate { txtLog.Text = ex.Message; });
                        }
                    }

    quinta-feira, 6 de outubro de 2016 17:10
  • Verifique se essa pasta é a única que você não tem acesso, pode ser que ele esteja herdando as permissões que estavam na pasta de dentro do arquivo compactado.

    Mas realmente é estranho, realizei testes aqui e funciona bem.


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco

    quinta-feira, 6 de outubro de 2016 17:52
  • Posso te enviar o arquivo .rar que estou tentando descompactar? Dentro do rar, possui duas pastas.
    quinta-feira, 6 de outubro de 2016 18:04
  • Pode enviar, posta no onedrive/google drive, etc e compartilha o link aqui


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco


    quinta-feira, 6 de outubro de 2016 18:28
  • André, enviei no seu e-mail. 

    Obrigado! 

    quinta-feira, 6 de outubro de 2016 19:35
  • Guilherme,

    Funcionou perfeitamente aqui.

    Desconfio que pode ser o tamanho do caminho criado. Lembre-se o windows ainda tem um limite de 256 caracteres.

    Vou dar um exemplo para entender o que é esse "caminho":

    C:\temp\Pasta123456 = Esse caminho tem 19 caracteres.

    Então, caso o caminho total ultrapassar 256 você vai começar a ter problemas para acessar, o que pode ser o seu caso.

    Entendeu?


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco

    quinta-feira, 6 de outubro de 2016 20:04
  • Estranho André, talvez seja algo entre minhas threads, to fazendo uma revisão do código aqui, obrigado cara!
    sexta-feira, 7 de outubro de 2016 02:44
  • Aqui retorna erro, descobri que é devido a versão do winrar que possuo instalado em minha máquina, estou com a versão 5.5 e o SharpCompress não suporta essa versão.

    Testei com um arquivo baixado da internet onde verifiquei que a versão é 4 e funcionou.

    sexta-feira, 16 de março de 2018 14:53