C# - Exibindo Arquivos e diretórios no TreeView com Progressbar


 Neste artigo vou mostrar como exibir arquivos e diretórios em um controle TreeView usando a linguagem C#.

Vamos criar uma aplicação Windows Forms na linguagem C# que vai utilizar um controle TreeView para exibir os arquivos e subdiretórios de uma pasta selecionada.

Para saber mais sobre o controle TreeView veja os meus artigos relacionados ao C# :

Recursos Usados:

Criando o projeto Windows Forms

Abra o VS 2017 Community e crie um projeto Windows Classic Desktop do tipo Windows Forms App(.NET Framework) com o nome CShp_TreeView:

No formulário Form1.cs do projeto inclua os seguintes controles:

Disponha os controle conforme o leiaute da figura abaixo:

Declare os seguintes namespaces no formulário:
 

using System;
using System.IO;
using System.Windows.Forms;

Incluindo imagens no controle ImageList

Vamos incluir duas imagens no controle ImageList.

Para isso abra a janela de propriedades do controle e clique em Images e inclua a imagem para o arquivo e a imagem para a pasta conforme mostra a figura abaixo:

Após isso selecione o controle TreeView e defina a sua propriedade StateImageList igual ao controle ImageList : imglist1 conforme abaixo:

Implementando o código do formulário

1- Código do evento Click do botão btnProcurar que permite ao usuário selecionar uma pasta:

        private void btnProcurar_Click(object sender, EventArgs e)
        {
            //atribui o valor da caixa de texto 
            fbdlg1.SelectedPath = txtDiretorio.Text;
            //exibe o dialogo folderbrowser
            DialogResult drResultado = fbdlg1.ShowDialog();
            //atribui o nome da pasta selecionada à caixa de texto
            if (drResultado == System.Windows.Forms.DialogResult.OK)
                txtDiretorio.Text = fbdlg1.SelectedPath;
        }

2- Código do evento Click do botão btnCarregarPasta que carrega os dados de uma pasta selecionada

        private void btnCarregarPasta_Click(object sender, EventArgs e)
        {
            // Define o valor inicial da progressbar
            pgbar1.Value = 0;
            // Limpa todos os Nodes 
            tvDados.Nodes.Clear();
            toolTip1.ShowAlways = true;
            //Carrega os dados da Pasta informada se ela existir
            if (txtDiretorio.Text != "" && Directory.Exists(txtDiretorio.Text))
            {
                CarregaDadosPasta(txtDiretorio.Text);
            }
            else
            {
                MessageBox.Show("Selecione uma pasta!!");
            }
        }

Precisamos definir o método CarregaDadosPasta().

3- Código do método CarregarDadosPasta

Neste código definimos o valor máximo para o controle ProgressBar com base na informação do diretório selecionado retornando o número de items existentes.

A seguire selecionamos um objeto do tipo TreeNode com o nome do diretorório informado e chamamos os métodos :

        private void CarregaDadosPasta(string diretorio)
        {
            DirectoryInfo diretorioInfo = new DirectoryInfo(diretorio);
            //Define o valor máximo do ProgressBar
            pgbar1.Maximum = Directory.GetFiles(diretorio, "*.*", SearchOption.AllDirectories).Length + Directory.GetDirectories(diretorio, "**", SearchOption.AllDirectories).Length;
            TreeNode tds = tvDados.Nodes.Add(diretorioInfo.Name);
            tds.Tag = diretorioInfo.FullName;
            tds.StateImageIndex = 0;
            //carrega os arquivos e as subpastas
            CarregaArquivos(diretorio, tds);
            CarregaSubDiretorios(diretorio, tds);
        }

4- Código do método CarregaArquivos

Neste código obtemos os arquivos do diretório e obtemos a informação do nome exibindo-o no TreeNode e atribuindo a imagem do ImageList de índice igual a 1:

        private void CarregaArquivos(string diretorio, TreeNode tnd)
        {
            string[] arquivos = Directory.GetFiles(diretorio, "*.*");
            // Percorre os arquivos
            foreach (string arq in arquivos)
            {
                FileInfo arquivo = new FileInfo(arq);
                TreeNode tds = tnd.Nodes.Add(arquivo.Name);
                tds.Tag = arquivo.FullName;
                tds.StateImageIndex = 1;
                AtualizaProgressBar();
            }
        }

5- Código do método CarregaSubDiretorios

Neste código carregamos os subdiretórios da pasta selecionada e obtemos o nome atribuindo ao TreeNode.

A seguir chamamos novamente os métodos para obter os arquivos e subpastas que podem existir em cada subpasta.

        private void CarregaSubDiretorios(string dir, TreeNode td)
        {
            // Pega todos os subdiretorios
            string[] subdiretorioEntradas = Directory.GetDirectories(dir);
            // Percorre os subdiretorios a ver se existem outras subpasts
            foreach (string subdiretorio in subdiretorioEntradas)
            {
                DirectoryInfo diretorio = new DirectoryInfo(subdiretorio);
                TreeNode tds = td.Nodes.Add(diretorio.Name);
                tds.StateImageIndex = 0;
                tds.Tag = diretorio.FullName;
                CarregaArquivos(subdiretorio, tds);
                CarregaSubDiretorios(subdiretorio, tds);
                AtualizaProgressBar();
            }
        }

 

6- Código do método AtualizaProgressBar

Este método atualiza a exibição do controle Progressbar durante a carga dos dados da pasta selecionada:

       private void AtualizaProgressBar()
        {
            if (pgbar1.Value < pgbar1.Maximum)
            {
                pgbar1.Value++;
                int percentual = (int)(((double)pgbar1.Value / (double)pgbar1.Maximum) * 100);
                pgbar1.CreateGraphics().DrawString(percentual.ToString() + "%", new Font("Arial", (float)8.25, FontStyle.Regular), Brushes.Black, 
new PointF(pgbar1.Width / 2 - 10, pgbar1.Height / 2 - 7));
                Application.DoEvents();
            }
        }

7- Código do evento MouseMove do controle TreeView

Neste código tratamos da exibição da ToolTip conforme a posição do ponteiro do mouse:

        private void tvDados_MouseMove(object sender, MouseEventArgs e)
        {
            // Pega o node na posição do ponteiro do mouse
            TreeNode theNode = this.tvDados.GetNodeAt(e.X, e.Y);
            // Define uma ToolTip somente se o ponteiro do mouse estive em um node
            if (theNode != null && theNode.Tag != null)
            {
                // Altera a ToolTip somente se o ponteiro do mouse se mover para um novo Node
                if (theNode.Tag.ToString() != this.toolTip1.GetToolTip(this.tvDados))
                    this.toolTip1.SetToolTip(this.tvDados, theNode.Tag.ToString());
            }
            else  // O ponteiro não esta sobre um Node então limpa a ToolTip.  
            {
                this.toolTip1.SetToolTip(this.tvDados, "");
            }
        }

Executando o projeto iremos obter o seguinte resultado:

1- Selecionando uma pasta e carregando os dados da pasta:

2- Exibindo os arquivos e subdiretórios

Pegue o código do projeto aqui :  CShp_TreeView.zip

Antes, como ministros de Deus, tornando-nos recomendáveis em tudo; na muita paciência, nas aflições, nas necessidades, nas angústias,Como contristados, mas sempre alegres; como pobres, mas enriquecendo a muitos; como nada tendo, e possuindo tudo. 
2 Coríntios 6:4,10

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti