none
Progress bar com o andamento real do processo RRS feed

  • Pergunta

  • Boa tarde pessoal, 

    Em C# é possivel fazer o uso do progressbar com o andamento real do processo que está sendo executado ?


    Fabio Aragao

    quarta-feira, 8 de novembro de 2017 18:40

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

    sexta-feira, 10 de novembro de 2017 12:55

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

    quarta-feira, 8 de novembro de 2017 19:19
  • 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

    quarta-feira, 8 de novembro de 2017 19:40
  • Boa tarde Felipe, pode me ajudar ?

    Fabio Aragao

    quinta-feira, 9 de novembro de 2017 15:36
  • 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

    quinta-feira, 9 de novembro de 2017 18:56
  • 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

    quinta-feira, 9 de novembro de 2017 19:05
  • Certo!

    Eu vou tentar fazer um projeto teste pra você, tudo bem?

    Outra coisa, como você vai saber que determinado exe vai para determinado diretório?

    Te dou um retorno até amanha, no máximo no final da tarde, tudo bem?

    att.

    Felipe

    quinta-feira, 9 de novembro de 2017 19:15
  • 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

    quinta-feira, 9 de novembro de 2017 19:25
  • Fabio, bom dia!

    Entendi.

    Estou finalizando o projeto de exemplo pra você.

    att.

    Felipe

    sexta-feira, 10 de novembro de 2017 12:40
  • Obrigado

    Fabio Aragao

    sexta-feira, 10 de novembro de 2017 12:54
  • 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

    sexta-feira, 10 de novembro de 2017 12:55
  • 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

    terça-feira, 28 de novembro de 2017 13:32