Usuário com melhor resposta
Progress bar com o andamento real do processo

Pergunta
-
Respostas
-
Fabio, segue abaixo um exemplo:
private void btnInstalar_Click(object sender, EventArgs e) { string diretorio = @"C:\diretorioFabio"; string subDiretorio = string.Empty; string diretorioFTP = string.Empty; string arquivo = string.Empty; string dirDesktop = @"C:\users\fd\desktop"; progressBar1.Value = 0; //VERIFICA SE O DIRETÓRIO EXISTE, CASO NÃO EXISTA SERÁ CRIADO UM DIRETÓRIO NO C:\ if (!Directory.Exists(diretorio)) Directory.CreateDirectory(@"C:\diretorioFabio"); //IF TERNÁRIO (SE GOLDEN ESTIVER CHECADO, IRÁ PREENCHER A VARIAVEL COM "Golden" subDiretorio = rdbGolden.Checked ? "Golden" : "Premium"; //VERIFICA SE O SUBDIRETÓRIO EXISTE, CASO NÃO EXISTA SERÁ CRIADO UM SUBDIRETÓRIO subDiretorio = Path.Combine(diretorio, subDiretorio); //CONCATENA O "diretorio" com o "subDiretorio" if (!Directory.Exists(subDiretorio)) Directory.CreateDirectory(subDiretorio); else { if (MessageBox.Show("O diretório " + subDiretorio + " já existe!\n\n- Se deseja SAIR, Clique em [CANCELAR]\n- Se deseja CONTINUAR, Clique em [REPETIR] ", "Criação de Diretorio", MessageBoxButtons.RetryCancel, MessageBoxIcon.Hand) == DialogResult.Cancel) { Application.Exit(); } else { //SIMULAÇÃO DE UM ACESSO FTP (VOU UTILIZAR UM DIRETÓRIO COM VÁRIOS EXE'S NA MINHA MÁQUINA diretorioFTP = @"C:\dirFTP"; //PEGA AS INFORMAÇÕES DO DIRETÓRIO "FTP" DirectoryInfo di = new DirectoryInfo(diretorioFTP); //VERIFICA SE O DIRETÓRIO "FTP" POSSUI ARQUIVOS if (di.GetFiles().Length == 0) { MessageBox.Show("Nenhum arquivo no diretório FTP!", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Warning); } else { //SETA O VALOR MÁXIMO DA PROGRESSBAR PARA A QUANTIDADE DE ARQVUISO DENTRO DO DIRETÓRIO "FTP" progressBar1.Maximum = di.GetFiles().Length; foreach (var item in di.GetFiles()) { arquivo = Path.Combine(subDiretorio, item.Name); //COPIA O EXE PARA O SUBDIRETÓRIO File.Move(item.FullName, arquivo); //REGISTRAR DLL (NÃO SEI O QUE VOCÊ PRECISA FAZER NESSA PARTE) //CRIAÇÃO DE ATALHOS NA AREA DE TRABALHO File.Copy(arquivo, Path.Combine(dirDesktop, item.Name)); //MOSTRA O PROCESSO NO LABEL E NA PROGRESSBAR lblStatus.Text = "Criando atalho " + item.Name + "..."; lblStatus.Refresh(); progressBar1.Value++; } MessageBox.Show("Instalação efetuada com sucesso!", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information); lblStatus.Visible = false; progressBar1.Maximum = 0; } } } }
Eu só não sei como registrar essas dll's que você está falando.
Mas com esse código da pra você seguir bem já, está bem detalhado.
Qualquer dúvida, estou a disposição.
att.
Felipe
- Marcado como Resposta Filipe B CastroModerator sexta-feira, 10 de novembro de 2017 19:21
Todas as Respostas
-
Fabio, boa tarde!
Sim, é possível.
Segue abaixo um exemplo simples de um "processamento".
private void button1_Click(object sender, EventArgs e) { int qtdItensProcessar = 10; progressBar1.Value = 0; progressBar1.Maximum = qtdItensProcessar; for (int i = 1; i <= qtdItensProcessar; i++) { progressBar1.Value++; label1.Text = "Processando Item " + i.ToString() + "..."; Thread.Sleep(1000); label1.Refresh(); } label1.Text = "Processamento realizado com sucesso!"; }
Coloquei o "Thread.Sleep(1000)" só para ficar um pouco lento pra você ver o funcionamento.
Em um processamento real, você não precisa colocar esse sleep, pois pode deixar o seu processo lento.
Segue abaixo um print do processamento:
Qualquer dúvida, estou a disposição.
att.
Felipe
- Marcado como Resposta Filipe B CastroModerator quinta-feira, 9 de novembro de 2017 14:02
- Não Marcado como Resposta Fabio Aragao quinta-feira, 9 de novembro de 2017 15:35
-
Fabio, boa tarde!
Sim, é possível.
Segue abaixo um exemplo simples de um "processamento".
private void button1_Click(object sender, EventArgs e) { int qtdItensProcessar = 10; progressBar1.Value = 0; progressBar1.Maximum = qtdItensProcessar; for (int i = 1; i <= qtdItensProcessar; i++) { progressBar1.Value++; label1.Text = "Processando Item " + i.ToString() + "..."; Thread.Sleep(1000); label1.Refresh(); } label1.Text = "Processamento realizado com sucesso!"; }
Coloquei o "Thread.Sleep(1000)" só para ficar um pouco lento pra você ver o funcionamento.
Em um processamento real, você não precisa colocar esse sleep, pois pode deixar o seu processo lento.
Segue abaixo um print do processamento:
Qualquer dúvida, estou a disposição.
att.
Felipe
Obrigado por responder Felipe,
No caso meu processo é o seguinte:
1 - Crio um diretorio no C:\
2 - Crio um subdiretorio dependendo do item selecionado
3 - Acesso a um FTP para baixar os executaveis correpondentes para o subdiretorio em questão
4 - Baixo e registro um conjunto de DLL's
5 - Crio os atalhos necessários dos executáveis na Area de Trabalho do Usuário.
Fabio Aragao
-
-
Boa tarde!
Desculpe a demora pra te dar um retorno.
Vamos lá, você sabe já como programar isso?
Pra você criar um diretório no C:\, e um subdiretório, não é necessário a utilização de um ProgressBar, pois isso é feito instantaneamente.
A partir do passo 3 você começa a utilizar a progressBar, porém, não sei como você vai fazer pra baixar esses arquivos, e nem registrar as dlls.
O que você pode fazer é o seguinte, fazer um "foreach" nos arquivos que estão sendo baixados do FTP e incrementar a sua progressbar, após o término do 5º passo.
Conseguiu entender, ou ficou muito complexo?
att.
Felipe
-
Ficou um pouco.. sou iniciante..
Eu não entendi como a aplicação vai validar que o processo atual foi concluido e passar para o outro.. tipo
Digamos que no FTP tenham 100 arquivo, a aplicação vai ter que ler a quantidade de arquivos no FTP para começar a mensurar o tempo, corrija-me se estou errado..
Fora isso vai ter que baixar os arquivos e assim ir incrementando a cada arquivo baixado sendo que ainda não fez os processos 4 e 5.
Fabio Aragao
-
-
Meu codigo até o momento está assim:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Security.AccessControl; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace App_Install_Golden_Premium { public partial class frmInstala : Form { public frmInstala() { InitializeComponent(); } private void btInstalar_Click(object sender, EventArgs e) { string diretorio = @"C:\Program Files\Teste\"; string subdiretorio; // Pega dominio/usuario logado atual string informacao = System.Security.Principal.WindowsIdentity.GetCurrent().Name; ; if (rbGolden.Checked) { subdiretorio = "Golden"; } else { subdiretorio = "Premium"; } diretorio += subdiretorio; if (Directory.Exists(diretorio)) { MessageBox.Show("O Diretório já existe!\n- Se deseja SAIR, Clique em [CANCELAR]\n- Se deseja CONTINUAR, Clique em [REPETIR] ", "Criação de Diretorio", MessageBoxButtons.RetryCancel, MessageBoxIcon.Hand); } else { DirectorySecurity regras = new DirectorySecurity(); regras.AddAccessRule(new FileSystemAccessRule(informacao, FileSystemRights.FullControl, AccessControlType.Allow)); Directory.CreateDirectory(diretorio); MessageBox.Show("Diretório Criado com Sucesso!", "Criação de Diretório", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } } }
Estou trabalhando com Radio Button, se o mesmo estiver "Checked" jogo o nome do subdiretorio para variavel e incremento o caminho do diretorio/subdiretorio
Outra duvida que estou tendo é na verificação se o diretorio existe...
Na verificação apresenta uma messagbox, até ai tudo bem.. mas gostaria de que quando o usuario clicasse em Cancelar, fechasse toda a aplicação.
Fabio Aragao
-
-
-
Fabio, segue abaixo um exemplo:
private void btnInstalar_Click(object sender, EventArgs e) { string diretorio = @"C:\diretorioFabio"; string subDiretorio = string.Empty; string diretorioFTP = string.Empty; string arquivo = string.Empty; string dirDesktop = @"C:\users\fd\desktop"; progressBar1.Value = 0; //VERIFICA SE O DIRETÓRIO EXISTE, CASO NÃO EXISTA SERÁ CRIADO UM DIRETÓRIO NO C:\ if (!Directory.Exists(diretorio)) Directory.CreateDirectory(@"C:\diretorioFabio"); //IF TERNÁRIO (SE GOLDEN ESTIVER CHECADO, IRÁ PREENCHER A VARIAVEL COM "Golden" subDiretorio = rdbGolden.Checked ? "Golden" : "Premium"; //VERIFICA SE O SUBDIRETÓRIO EXISTE, CASO NÃO EXISTA SERÁ CRIADO UM SUBDIRETÓRIO subDiretorio = Path.Combine(diretorio, subDiretorio); //CONCATENA O "diretorio" com o "subDiretorio" if (!Directory.Exists(subDiretorio)) Directory.CreateDirectory(subDiretorio); else { if (MessageBox.Show("O diretório " + subDiretorio + " já existe!\n\n- Se deseja SAIR, Clique em [CANCELAR]\n- Se deseja CONTINUAR, Clique em [REPETIR] ", "Criação de Diretorio", MessageBoxButtons.RetryCancel, MessageBoxIcon.Hand) == DialogResult.Cancel) { Application.Exit(); } else { //SIMULAÇÃO DE UM ACESSO FTP (VOU UTILIZAR UM DIRETÓRIO COM VÁRIOS EXE'S NA MINHA MÁQUINA diretorioFTP = @"C:\dirFTP"; //PEGA AS INFORMAÇÕES DO DIRETÓRIO "FTP" DirectoryInfo di = new DirectoryInfo(diretorioFTP); //VERIFICA SE O DIRETÓRIO "FTP" POSSUI ARQUIVOS if (di.GetFiles().Length == 0) { MessageBox.Show("Nenhum arquivo no diretório FTP!", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Warning); } else { //SETA O VALOR MÁXIMO DA PROGRESSBAR PARA A QUANTIDADE DE ARQVUISO DENTRO DO DIRETÓRIO "FTP" progressBar1.Maximum = di.GetFiles().Length; foreach (var item in di.GetFiles()) { arquivo = Path.Combine(subDiretorio, item.Name); //COPIA O EXE PARA O SUBDIRETÓRIO File.Move(item.FullName, arquivo); //REGISTRAR DLL (NÃO SEI O QUE VOCÊ PRECISA FAZER NESSA PARTE) //CRIAÇÃO DE ATALHOS NA AREA DE TRABALHO File.Copy(arquivo, Path.Combine(dirDesktop, item.Name)); //MOSTRA O PROCESSO NO LABEL E NA PROGRESSBAR lblStatus.Text = "Criando atalho " + item.Name + "..."; lblStatus.Refresh(); progressBar1.Value++; } MessageBox.Show("Instalação efetuada com sucesso!", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information); lblStatus.Visible = false; progressBar1.Maximum = 0; } } } }
Eu só não sei como registrar essas dll's que você está falando.
Mas com esse código da pra você seguir bem já, está bem detalhado.
Qualquer dúvida, estou a disposição.
att.
Felipe
- Marcado como Resposta Filipe B CastroModerator sexta-feira, 10 de novembro de 2017 19:21
-
Bom dia Felipe, tentei adaptar o codigo para minha necessidade e está exibindo uma mensagem de erro na depuração do visual Studio
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Net; using System.Security.AccessControl; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace App_Install_Golden_Premium { public partial class frmInstala : Form { public frmInstala() { InitializeComponent(); } private void btInstalar_Click(object sender, EventArgs e) { string diretorio = @"C:\Program Files\Teste\"; string subdiretorio; string diretorioFTP = string.Empty; string usuario; string senha; string arquivo = string.Empty; var pathWithEnv = @"%USERPROFILE%\Área de Trabalho"; var filePath = Environment.ExpandEnvironmentVariables(pathWithEnv); string dirDesktop = filePath; progressBar1.Value = 0; // Pega dominio/usuario logado atual string informacao = System.Security.Principal.WindowsIdentity.GetCurrent().Name; ; if (rbGolden.Checked) { subdiretorio = "Golden"; diretorioFTP = "ftp://ftp.ftp remoto"; usuario = "usuario"; senha = "senha"; } else { subdiretorio = "Premium"; diretorioFTP = "ftp://ftp.ftp remoto"; usuario = "usuario"; senha = "senha"; } diretorio += subdiretorio; if (Directory.Exists(diretorio)) { if (MessageBox.Show("O Diretório já existe!\n- Se deseja SAIR, Clique em [CANCELAR]\n- Se deseja CONTINUAR, Clique em [REPETIR] ", "Criação de Diretorio", MessageBoxButtons.RetryCancel, MessageBoxIcon.Hand) == DialogResult.Cancel) { Application.Exit(); } } else { Directory.CreateDirectory(diretorio); DirectorySecurity regras = new DirectorySecurity(); regras.AddAccessRule(new FileSystemAccessRule(informacao, FileSystemRights.FullControl, AccessControlType.Allow)); MessageBox.Show("Diretório Criado com Sucesso!", "Criação de Diretório", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } FtpWebRequest request = (FtpWebRequest)WebRequest.Create(diretorioFTP); request.Method = WebRequestMethods.Ftp.DownloadFile; request.Credentials = new NetworkCredential(usuario, senha); FtpWebResponse response = (FtpWebResponse)request.GetResponse(); DirectoryInfo di = new DirectoryInfo(diretorioFTP); progressBar1.Maximum = di.GetFiles().Length; foreach( var item in di.GetFiles()) { arquivo = Path.Combine(diretorio, item.Name); File.Copy(item.FullName, arquivo); lblStatus.Refresh(); progressBar1.Value++; } MessageBox.Show("Instalação efetuada com sucesso!", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information); lblStatus.Visible = false; progressBar1.Maximum = 0; } } }
O erro ocorre nesta linha:
DirectoryInfo di = new DirectoryInfo(diretorioFTP);
Os detalhes do erro são os seguintes:
System.NotSupportedException não foi manipulada HResult=-2146233067 Message=Não há suporte para o formato do caminho dado. Source=mscorlib StackTrace: em System.Security.Permissions.FileIOPermission.EmulateFileIOPermissionChecks(String fullPath) em System.IO.DirectoryInfo.Init(String path, Boolean checkHost) em System.IO.DirectoryInfo..ctor(String path) em App_Install_Golden_Premium.frmInstala.btInstalar_Click(Object sender, EventArgs e) na D:\Fabio\Visual Studio\Projeto Golden Premium Download e instalacao\Instalador_golden_premium\App_Install_Golden_Premium\App_Install_Golden_Premium\frmInstala.cs:linha 78 em System.Windows.Forms.Control.OnClick(EventArgs e) em System.Windows.Forms.Button.OnClick(EventArgs e) em System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) em System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) em System.Windows.Forms.Control.WndProc(Message& m) em System.Windows.Forms.ButtonBase.WndProc(Message& m) em System.Windows.Forms.Button.WndProc(Message& m) em System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) em System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) em System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) em System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) em System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData) em System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) em System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) em System.Windows.Forms.Application.Run(Form mainForm) em App_Install_Golden_Premium.Program.Main() na D:\Fabio\Visual Studio\Projeto Golden Premium Download e instalacao\Instalador_golden_premium\App_Install_Golden_Premium\App_Install_Golden_Premium\Program.cs:linha 19 em System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) em System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) em Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() em System.Threading.ThreadHelper.ThreadStart_Context(Object state) em System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) em System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) em System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) em System.Threading.ThreadHelper.ThreadStart() InnerException:
Poderia me ajudar ?
Fabio Aragao