Usuário com melhor resposta
Extrair aquivos do My.Resources com ProgressBar

Pergunta
-
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
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
-
-
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
-
-
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).
- Sugerido como Resposta Ricardo Barbosa Cortes sexta-feira, 20 de junho de 2014 11:23
- Não Sugerido como Resposta Ricardo Barbosa Cortes sexta-feira, 20 de junho de 2014 18:45
-
-
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.
-
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
-
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").
-
-
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
-
-
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.