ASP .NET -  Exibindo a estrutura de um diretório com TreeView (C#)

Que tal usar o controle TreeView da ASP .NET para exibir os arquivos de um diretório no servidor ? É isso que vamos mostrar neste artigo.

O controle TreeView pode ser usado para consumir informação de uma fonte de dados hierárquica como um arquivo XML e de estruturas de tabelas e pastas e então exibir esta informação em uma página web.

O principais recursos do controle TreeView são:

O controle TreeView é feito de um ou mais nós (nodes) e cada entrada na árvore (tree) é chamado (node) e é representado pelo objeto TreeNode. A seguir temos uma descrição dos diferentes tipos de nós no TreeView:

Tipo de nó Descrição
Root(Raiz)  Um nó que não possui nenhum nó pai e possui um ou mais nós filhos.
Parent(Pai)  Um nó que possui um nó pai e um ou mais nós filhos.
Leaf(Folha)  Um nó que não possui nenhum nó filho.

Por padrão um controle TreeView possui somente um nó Root, mas podemos criar múltiplos nós Root em sua estrutura.

Cada nó tem uma propriedade Text e uma propriedade Value. O valor da propriedade Text é exibida no controle TreeView, enquanto a propriedade Value é usada para armazenar quaisquer dados adicionais sobre o nó, como dados passados para o evento de postagem que está associado com o nó.

Quando um nó é clicado ele pode disparar um evento de seleção (via postback) ou navegar para outra página. Quando a propriedade NavigateUrl não estiver definida, clicar em um nó irá disparar o evento SelectedNodeChanged que pode ser tratado para fornecer a funcionalidade desejada.

Cada nó também possui uma propriedade SelectAction que pode ser usada para determina ações específicas que acontecem quando um nó for clicado, tal como expandir ou contrair os nós. Ao invés de disparar um evento selection para navegar para uma página quando o nó for clicado, defina a propriedade NavigateUrl do nó para o valor diferente de string vazia("").

Obtendo o caminho virtual e o físico

O método MapPath é usado para resolver caminhos virtuais e caminhos físicos.

Quando rodamos uma aplicação ASP .NET usando o servidor de desenvolvimento  na máquina local o caminho não é o mesmo que seria se estivéssemos rodando no servidor.

Quando usamos MapPath a utilização do til (~) indica a raiz do caminho virtual. É preciso usar o til (~) para que a ASP .NET consiga distinguir se o caminho é relativo (com o til) ou absoluto (sem o til).

Exemplos:

1- Caminhos virtuais 2- Caminhos Físicos
 ~/App_Data/Sample.xml
 ~/
 ~/Map.txt
 C:\Website\Files\Sample.xml
 C:\Website\Default.aspx
 C:\Website\Map.txt

Podemos usar MapPath em qualquer arquivo em nosso web site ASP .NET. (No projeto ASP .NET)

Nota: Os métodos Server.MapPath e Request.MapPath atuam praticamente da mesma forma.

Podemos também obter um caminho virtual usando a propriedade ApplicationPath :

//retorna o caminho virtual da aplicação
string appPath = HttpContext.Current.Request.ApplicationPath;

Para converter o caminho virtual para o caminho físico podemos usar Request.MapPath:

//converte o caminho virtual da aplicação em camiho físico
string physicalPath = HttpContext.Current.Request.MapPath(appPath);

Objetivo

Exibir a estrutura de arquivos de uma pasta no servidor

Recursos usados:

Criando o web site

Abra o Visual Studio 2012 Express for Web e clique em New Web Site;

Selecione a linguagem Visual Basic  e o template ASP .NET Empty Web Site e informe o nome TreeView_Diretorio;

A seguir no menu WEBSITE clique em Add New Item e selecione o template WebForm aceitando no nome padrão Default.aspx;

A seguir selecione o arquivo Default.aspx abrindo-o no editor.

Selecione a guia Source e inclua um controle TreeView a partir da ToolBox definindo suas propriedades conforme o código abaixo:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <style type="text/css">
        .auto-style1 {
            color: #3366CC;
            font-size: x-large;
        }
    </style>
</head>
<body>
    <form id="form1" runat="server">
        <span class="auto-style1"><strong>Macoratti .net</strong></span>
    <hr />
    <div>
       <asp:TreeView Id="MacTree" PathSeparator = "|"  ExpandDepth="0" runat="server" ImageSet="Arrows" AutoGenerateDataBindings   ="False" Height="189px" Width="157px">
            <SelectedNodeStyle Font-Underline="True"  HorizontalPadding="0px" VerticalPadding="0px" ForeColor="#5555DD"></SelectedNodeStyle>
            <NodeStyle VerticalPadding="0px" Font-Names="Tahoma" Font-Size="10pt" HorizontalPadding="5px" ForeColor="#000000" NodeSpacing="0px"></NodeStyle>
            <ParentNodeStyle Font-Bold="False" />
            <HoverNodeStyle Font-Underline="True" ForeColor="#5555DD"></HoverNodeStyle>
         </asp:TreeView> 
    </div>
    </form>
</body>
</html

No arquivo code-behind Default.aspx.cs defina os namespaces usados:

using System;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.IO;

E inclua o código no evento Load da página:

 protected void Page_Load(object sender, EventArgs e)
    {
        if (Page.IsPostBack == false)
        {
            //defina o caminho c:/_aspn para exibir os diretórios
            DirectoryInfo RootDir = new System.IO.DirectoryInfo("c://_aspn");
            // saida do diretório no nó
            TreeNode RootNode = ExibeDiretorio(RootDir, null);

            // adiciona a saida na árvore(tree)
            MyTree.Nodes.Add(RootNode);
        }
    }

A seguir crie a rotina ExibeDiretorio() conforme o código a seguir:

TreeNode ExibeDiretorio(System.IO.DirectoryInfo diretorio, TreeNode noPai)
    {
        // valida o parâmetro
        if (diretorio == null) return null; 
        // cria um nó para este diretorio
        TreeNode DirNode = new TreeNode(diretorio.Name);
        // obtem subdiretorios do diretorio atual
        DirectoryInfo[] SubDirectories = diretorio.GetDirectories();
        // exibe cada subdiretorio
        for (int ContaDiretorios = 0; ContaDiretorios < SubDirectories.Length; ContaDiretorios++)
        {
            ExibeDiretorio(SubDirectories[ContaDiretorios], DirNode);
        }
        // exibe os arquivos do diretorio atual
        FileInfo[] Arquivos = diretorio.GetFiles();
        for (int contaArquivos = 0; contaArquivos < Arquivos.Length; contaArquivos++)
        {
            DirNode.ChildNodes.Add(new TreeNode(Arquivos[contaArquivos].Name));
        }   // se o nó pai for null retorna este no
        // se for null adiciona este  no ao Pai e retorna o Pai
        if (noPai == null)
        {
            return DirNode;
        }
        else
        {
            noPai.ChildNodes.Add(DirNode);
            return noPai;
        }
    }

Executando o projeto do web site iremos obter o seguinte resultado:

Pegue o projeto completo aqui :    TreeView_Diretorio.zip

Flp 3:17 Irmãos, sede meus imitadores, e atentai para aqueles que andam conforme o exemplo que tendes em nós;

Flp 3:18 porque muitos há, dos quais repetidas vezes vos disse, e agora vos digo até chorando, que são inimigos da cruz de Cristo;

Flp 3:19 cujo fim é a perdição; cujo deus é o ventre; e cuja glória assenta no que é vergonhoso; os quais só cuidam das coisas terrenas.

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

Quer migrar para o VB .NET ?

Quer aprender C# ??

 

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter
 

Referências:


José Carlos Macoratti