none
Extrair aquivos do My.Resources com ProgressBar RRS feed

  • Pergunta

  • Olá pessoal, como faço para minha aplicação extrair um arquivo do My.Resources, mostrando o progresso em um ProgressBar, em VB.NET Windows Forms? Obrigado.
    • Editado Free4k quinta-feira, 19 de junho de 2014 13:56
    sábado, 14 de junho de 2014 17:36

Respostas

  • Entao Howar, veja que você pegou a classe que eu escrevi e copiou ela ABAIXO da classe "frm_main"

    Eu escrevi uma classe do zero pois eu não tinha como saber o nome que você tinha dado para sua. Na verdade era para você substituir uma pela outra.

    O código em "frm_main.vb" do seu projeto ficou assim (completo):

    Public Class frm_main
        Public Sub ByFilePut()
            pgrbr.Maximum = 100 'Define o limite máximo do PROGRESSBAR. Defini como 100 pois vou colocar de 1% a 100%.
            Dim Bs() As Byte = My.Resources.teste  'Do Resource para um Array de CHAR.
            Dim SLOT As Integer = Microsoft.VisualBasic.FreeFile() 'Pega o SLOT livre.
            Microsoft.VisualBasic.FileOpen(SLOT, ".\\teste.exe", Microsoft.VisualBasic.OpenMode.Binary) 'Abre o arquivo, binário para escrever.
            Dim COUNT As Long = 0L 'Contador de Bytes escritos.
            For Each B As Byte In Bs 'Para cada B(Char) no Array escreve.
                Microsoft.VisualBasic.FilePut(SLOT, B) 'Escreve o CHAR no arquivo.
                COUNT += 1 'Incrementa o contador
                If (COUNT Mod 1024) = 0 Then 'Para cada 1024 Bytes escritos (porque eu quis assim, pode ser de 1 em 1 ou de X em X).
                    pgrbr.Value = CInt((COUNT / Bs.Length) * 100) 'Essa operação vai dar 1%, 2% e assim por diante.
                    Me.Refresh() 'Atualiza o formulário. Se você não der Refresh, o ProgressBar vai ser atualizado, mas não vai exibir nada na tela pois ele estará parado enquanto a função executa*.
                End If
            Next B
            Microsoft.VisualBasic.FileClose(SLOT) 'Fecha o arquivo!
        End Sub
    
        Public Sub ByBinaryWriter()
            pgrbr.Maximum = 100 'Define o limite máximo do PROGRESSBAR. Defini como 100 pois vou colocar de 1% a 100%.
            Dim Bs() As Byte = My.Resources.teste
            Dim Writer As New System.IO.BinaryWriter(System.IO.File.Open(".\\teste.exe", System.IO.FileMode.Create))
            Dim COUNT As Long = 0L 'Contador de Bytes escritos
            For Each B As Byte In Bs 'Para cada B(Char) no Array escreve.
                Writer.Write(B) 'Escreve o CHAR no arquivo.
                COUNT += 1 'Incrementa o contador
                If (COUNT Mod 1024) = 0 Then 'Para cada 1024 Bytes escritos (porque eu quis assim, pode ser de 1 em 1 ou de X em X).
                    pgrbr.Value = CInt((COUNT / Bs.Length) * 100) 'Essa operação vai dar 1%, 2% e assim por diante.
                    Me.Refresh() 'Atualiza o formulário. Se você não der Refresh, o ProgressBar vai ser atualizado, mas não vai exibir nada na tela pois ele estará parado enquanto a função executa*.
                End If
            Next B
            Writer.Close() 'Fecha o arquivo!
            Writer = Nothing
        End Sub
    End Class

    Eu alterei de CHAR para BYTE, pois CHAR eu usei em um arquivo TXT. O que você está usando é um EXE, então o ARRAY é de BYTE não de CHAR. Fora isso não mudei nada.

    Agora, no evento CLICK do botão "btn_Extrair" você pode chamar "Me.ByBinaryWriter()" ou "Me.ByFilePut". O método que você gostar mais.


    • Sugerido como Resposta SammuelMiranda quarta-feira, 2 de julho de 2014 12:20
    • Marcado como Resposta Free4k quarta-feira, 2 de julho de 2014 14:20
    • Editado SammuelMiranda quarta-feira, 2 de julho de 2014 22:31
    quarta-feira, 2 de julho de 2014 12:20

Todas as Respostas

  • Oi, então meu caro Howar, o Save() que você pode chamar dos seus arquivos dentro do Resources irá salvar o arquivo em um Path corretamente, mas não é possível acompanhar o processo.

    O que você pode fazer é considerar o arquivo como um array de bytes. Assim sendo, abra o arquivo no disco (usando FileOpen(Slot, Path, Método:Binário)) e escreva, usando um laço "FOR EACH B AS BYTE IN Array" e depois feche o arquivo (FileClose(Slot)).

    Assim sendo, dentro do laço FOR, a cada byte (ou a cada grupo de bytes que você escrever) você incrementa a propriedade VALUE do Progressbar. E da Refresh no form.

    • Sugerido como Resposta SammuelMiranda terça-feira, 17 de junho de 2014 11:38
    • Marcado como Resposta Ricardo Barbosa Cortes terça-feira, 17 de junho de 2014 19:13
    • Não Marcado como Resposta Free4k quinta-feira, 19 de junho de 2014 13:56
    • Não Sugerido como Resposta Ricardo Barbosa Cortes sexta-feira, 20 de junho de 2014 18:45
    terça-feira, 17 de junho de 2014 11:37
  • Poderia mostrar-me um exemplo de como fazer?
    quarta-feira, 18 de junho de 2014 15:01
  • Claro.

    Veja o código:

    Friend Class WriteResource
            Inherits System.Windows.Forms.Form
            Private Progbar As System.Windows.Forms.ProgressBar
    
            Friend Sub ByFilePut()
                Progbar.Maximum = 100 'Define o limite máximo do PROGRESSBAR. Defini como 100 pois vou colocar de 1% a 100%.
                Dim Bs() As Char = My.Resources.sof.ToCharArray() 'Do Resource para um Array de CHAR.
                Dim SLOT As Integer = Microsoft.VisualBasic.FreeFile() 'Pega o SLOT livre.
                Microsoft.VisualBasic.FileOpen(SLOT, "C:\Arquivo.txt", Microsoft.VisualBasic.OpenMode.Binary) 'Abre o arquivo, binário para escrever.
                Dim COUNT As Long = 0L 'Contador de Bytes escritos.
                For Each B As Char In Bs 'Para cada B(Char) no Array escreve.
                    Microsoft.VisualBasic.FilePut(SLOT, B) 'Escreve o CHAR no arquivo.
                    COUNT += 1 'Incrementa o contador
                    If (COUNT Mod 1024) = 0 Then 'Para cada 1024 Bytes escritos (porque eu quis assim, pode ser de 1 em 1 ou de X em X).
                        Progbar.Value = CInt((COUNT / Bs.Length) * 100) 'Essa operação vai dar 1%, 2% e assim por diante.
                        Me.Refresh() 'Atualiza o formulário. Se você não der Refresh, o ProgressBar vai ser atualizado, mas não vai exibir nada na tela pois ele estará parado enquanto a função executa*.
                    End If
                Next B
                Microsoft.VisualBasic.FileClose(SLOT) 'Fecha o arquivo!
            End Sub
    
            Friend Sub ByBinaryWriter()
                Progbar.Maximum = 100 'Define o limite máximo do PROGRESSBAR. Defini como 100 pois vou colocar de 1% a 100%.
                Dim Bs() As Char = My.Resources.sof.ToCharArray()
                Dim Writer As New System.IO.BinaryWriter(System.IO.File.Open("C:\Arquivo.txt", System.IO.FileMode.Create))
                Dim COUNT As Long = 0L 'Contador de Bytes escritos
                For Each B As Char In Bs 'Para cada B(Char) no Array escreve.
                    Writer.Write(B) 'Escreve o CHAR no arquivo.
                    COUNT += 1 'Incrementa o contador
                    If (COUNT Mod 1024) = 0 Then 'Para cada 1024 Bytes escritos (porque eu quis assim, pode ser de 1 em 1 ou de X em X).
                        Progbar.Value = CInt((COUNT / Bs.Length) * 100) 'Essa operação vai dar 1%, 2% e assim por diante.
                        Me.Refresh() 'Atualiza o formulário. Se você não der Refresh, o ProgressBar vai ser atualizado, mas não vai exibir nada na tela pois ele estará parado enquanto a função executa*.
                    End If
                Next B
                Writer.Close() 'Fecha o arquivo!
                Writer = Nothing
            End Sub
    
            '* Outra forma de fazer a incrementação do ProgressBar é colocando ele em outra THREAD, mas não mostrei isso no exemplo.
        End Class

    Espero ter ajudado.

    Sobre a Thread, a função roda em uma Thread só. Se você souber fazer um sistema multi-Thread beleza, se não, é muita coisa pra explicar, mas não é complicado.

    • Sugerido como Resposta SammuelMiranda quarta-feira, 18 de junho de 2014 16:49
    quarta-feira, 18 de junho de 2014 16:48
  • Como faço para usar o Progressbar? Obrigado.
    quarta-feira, 18 de junho de 2014 19:18
  • Não entendi.

    O que eu mostrei ai é o código de uma classe Form. Ela tem um ProgressBar chamado ProgBar adicionado.

    Explique sua dúvida (isso soa engraçado - mas não te entendi mesmo).

    quinta-feira, 19 de junho de 2014 22:47
  • Eu coloquei o código, e substituí "Progbar" por o nome do ProgressBar, era isso mesmo que era para fazer?
    sexta-feira, 20 de junho de 2014 13:50
  • Mande o código do seu form, e o código no "*.designer.vb" (suponha que seu form se chame "Form1", ache o arquivo "Form1.Designer.vb", copie o código aqui).

    Nele você vai encontrar algum componente que é um progressbar, pode ser que esteja como "Progressbar1" ou algo assim. Eu substituí esse nome ("ProgressBar1" que está no arquivo "Form1.Designer.vb") por "ProgBar". Só isso.

    Copie o código aqui para eu te dizer.

    segunda-feira, 23 de junho de 2014 17:05
  • Olá, desculpa pela demora, estive ocupado com os estudos. Apareceu a tela da morte do VB, erro no design. Isso que você disse de substituir o nome, não seria a mesma coisa que substituir no seu código? Precisa utilizar uma nova classe para fazer isto? Pois eu tinha feito na mesma classe do Form, criei outra e apareceu alguns erros.
    • Editado Free4k domingo, 29 de junho de 2014 00:30
    domingo, 29 de junho de 2014 00:24
  • Howar, poste a sua aplicação para eu poder te dizer - não, entenda que o "ProgBar" é o nome que eu dei para a ProgressBar que está no Form.

    Você apenas precisa copiar os Subs ("ByFilePut" ou "ByBinaryWriter") e substituir nele, onde está "ProgBar" pela ProgressBar do seu Form, veja no seu form o nome dela.

    Veja também que eu fixei o arquivo como "C:\Arquivo.txt", substitua isso pelo caminho correto ou por qualquer função que desejar.

    Se você ainda tiver dúvida, preciso do código do seu form (tanto o "Form1.vb" - se esse for o nome - quanto o "Form1.Designer.vb").

    segunda-feira, 30 de junho de 2014 11:38
  • Eu hospedei o projeto, clique aqui para fazer o download.

    Obrigado.

    segunda-feira, 30 de junho de 2014 13:22
  • Entao Howar, veja que você pegou a classe que eu escrevi e copiou ela ABAIXO da classe "frm_main"

    Eu escrevi uma classe do zero pois eu não tinha como saber o nome que você tinha dado para sua. Na verdade era para você substituir uma pela outra.

    O código em "frm_main.vb" do seu projeto ficou assim (completo):

    Public Class frm_main
        Public Sub ByFilePut()
            pgrbr.Maximum = 100 'Define o limite máximo do PROGRESSBAR. Defini como 100 pois vou colocar de 1% a 100%.
            Dim Bs() As Byte = My.Resources.teste  'Do Resource para um Array de CHAR.
            Dim SLOT As Integer = Microsoft.VisualBasic.FreeFile() 'Pega o SLOT livre.
            Microsoft.VisualBasic.FileOpen(SLOT, ".\\teste.exe", Microsoft.VisualBasic.OpenMode.Binary) 'Abre o arquivo, binário para escrever.
            Dim COUNT As Long = 0L 'Contador de Bytes escritos.
            For Each B As Byte In Bs 'Para cada B(Char) no Array escreve.
                Microsoft.VisualBasic.FilePut(SLOT, B) 'Escreve o CHAR no arquivo.
                COUNT += 1 'Incrementa o contador
                If (COUNT Mod 1024) = 0 Then 'Para cada 1024 Bytes escritos (porque eu quis assim, pode ser de 1 em 1 ou de X em X).
                    pgrbr.Value = CInt((COUNT / Bs.Length) * 100) 'Essa operação vai dar 1%, 2% e assim por diante.
                    Me.Refresh() 'Atualiza o formulário. Se você não der Refresh, o ProgressBar vai ser atualizado, mas não vai exibir nada na tela pois ele estará parado enquanto a função executa*.
                End If
            Next B
            Microsoft.VisualBasic.FileClose(SLOT) 'Fecha o arquivo!
        End Sub
    
        Public Sub ByBinaryWriter()
            pgrbr.Maximum = 100 'Define o limite máximo do PROGRESSBAR. Defini como 100 pois vou colocar de 1% a 100%.
            Dim Bs() As Byte = My.Resources.teste
            Dim Writer As New System.IO.BinaryWriter(System.IO.File.Open(".\\teste.exe", System.IO.FileMode.Create))
            Dim COUNT As Long = 0L 'Contador de Bytes escritos
            For Each B As Byte In Bs 'Para cada B(Char) no Array escreve.
                Writer.Write(B) 'Escreve o CHAR no arquivo.
                COUNT += 1 'Incrementa o contador
                If (COUNT Mod 1024) = 0 Then 'Para cada 1024 Bytes escritos (porque eu quis assim, pode ser de 1 em 1 ou de X em X).
                    pgrbr.Value = CInt((COUNT / Bs.Length) * 100) 'Essa operação vai dar 1%, 2% e assim por diante.
                    Me.Refresh() 'Atualiza o formulário. Se você não der Refresh, o ProgressBar vai ser atualizado, mas não vai exibir nada na tela pois ele estará parado enquanto a função executa*.
                End If
            Next B
            Writer.Close() 'Fecha o arquivo!
            Writer = Nothing
        End Sub
    End Class

    Eu alterei de CHAR para BYTE, pois CHAR eu usei em um arquivo TXT. O que você está usando é um EXE, então o ARRAY é de BYTE não de CHAR. Fora isso não mudei nada.

    Agora, no evento CLICK do botão "btn_Extrair" você pode chamar "Me.ByBinaryWriter()" ou "Me.ByFilePut". O método que você gostar mais.


    • Sugerido como Resposta SammuelMiranda quarta-feira, 2 de julho de 2014 12:20
    • Marcado como Resposta Free4k quarta-feira, 2 de julho de 2014 14:20
    • Editado SammuelMiranda quarta-feira, 2 de julho de 2014 22:31
    quarta-feira, 2 de julho de 2014 12:20
  • Muito obrigado, então posso usar qualquer uma das Subs?
    quarta-feira, 2 de julho de 2014 14:21
  • Pode, o resultado é o mesmo. O que fiz foi escrever duas para você saber que ambas as formas são usadas, mas a primeira, "ByFilePut", usa o médoto herdado do VB6 (e VBA) da biblioteca Microsoft.VisualBasic. O método usando o "ByBinaryWriter" usa a classe do DotNet.
    quarta-feira, 2 de julho de 2014 22:30