ASP .NET - Exibindo os nomes e a quantidade de arquivos de um diretório (C#)


Nesta dica vou mostrar como podemos exibir facilmente os arquivos de um diretório em uma pasta do servidor em uma aplicação ASP .NET Web Forms.

Estou usando o Visual Studio Express 2012 for Web (esta versão é grátis e pode ser baixada aqui : http://www.microsoft.com/visualstudio/ptb/downloads)

Abra o Visual Studio Express 2012 for Web e no menu File clique em New Project;

Selecione o template Visual C# -> ASP .NET Empty Web Application e informe o nome ExibindoImagens e clique no botão OK;

No menu PROJECT clique em Add New Item;

Selecione Web -> Web Form e informe o nome Default.aspx ou aceite o nome padrão e clique no botão Add;

Abra o arquivo Default.aspx e no modo Source defina o código abaixo onde incluímos um controle ListBox com ID igual lstbArquivos e formatamos a aparência da página:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="ExibindoImagens.Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Arquivos</title>
    <style type="text/css">
        .auto-style1 {
            font-size: x-large;
            color: #003399;
        }
    </style>
</head>
<body>
    <form id="form1" runat="server">
        <strong><span class="auto-style1">Macoratti .net - Listando arquivos 
     </span></strong> 
     <hr />     
    <div>
        <asp:ListBox ID="lstbArquivos" runat="server" Height="247px" Width="318px" style="background-color: #CCFF99"></asp:ListBox>
    </div>
    </form>
</body>
</html>

Abaixo vemos a página no modo Design:

No menu PROJECT clique em New Folder e crie um novo diretório chamado Imagens no projeto. A seguir clique com o botão direito do mouse sobre este diretório e selecione Add -> Existing Item incluindo arquivos nesta pasta.

Agora abra o arquivo Default.aspx.cs e digite o código abaixo definindo o namespace System.IO e usando o evento Load da página para ler os arquivos de um tipo de uma pasta e exibi-lo em um controle ListBox:

using System;
using System.IO;

namespace ExibindoImagens
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            // Le todos os arquivos de um tipo no diretorio
            DirectoryInfo arquivos = new DirectoryInfo(Server.MapPath("~/Imagens/"));
            // Pega todas as imagens .gif
            lstbArquivos.DataSource = arquivos.GetFiles("*.gif");
            // vincula os dados no listbox 
            lstbArquivos.DataBind(); 
        }
    }
}
O mesmo código para a linguagem VB .NET seria assim:

o namespace : Imports System.IO

O código:

Dim arquivos As DirectoryInfo = New DirectoryInfo(Server.MapPath("~/Imagens/"))
lstbArquivos.DataSource = arquivos .GetFiles("*.gif")
lstbArquivos.DataBind()

O código acima esta listando os arquivos com extensão .gif do diretório Imagens que esta na raiz da aplicação;

Para listar outros tipos de arquivos bastas mudar a extensão (Ex: *.* lista todos os arquivos). Para escolher outra pasta informe o seu caminho conforme exemplo abaixo:

// Le todos os arquivos de um tipo no diretorio c:/dados no servidor
DirectoryInfo arquivos = new DirectoryInfo(Server.MapPath(@"c:/dados/"));
// Pega todos os arquivos
lstbArquivos.DataSource = arquivos.GetFiles("*.*");

Podemos também exibir a quantidade de arquivos na pasta usando uma sobrecarga do método GetFiles():

Directory.GetFiles Method (String, String, SearchOption)

Este método retorna os nomes dos arquivos (incluindo seus caminhos) que coincidem com o critério especificado no parâmetro SearchOption.

A enumeração SearchOption especifica se a busca será feita no diretório atual ou no diretório atual e todos os subdiretórios.

Os valores possíveis são:

TopDirectoryOnly - Inclui somente o diretório atual na operação de busca;
AllDirectories - Inclui o diretório atual e todos os seus subdiretórios na operação de busca;

Exemplos de uso:

int contaArquivos = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories).Length;
// retorn o total de arquivos na pasta e subpastas

int contaArquivos = Directory.GetFiles(path, "*.*", SearchOption.TopDirectoryOnly).Length;
// retorna o total de arquivos na pasta

int contaArquivos = Directory.GetFiles(path, "*.xml", SearchOption.AllDirectories).Length;
// retorn o total de arquivos com extensão .xml no diretório e subdiretórios

Vamos alterar o código do exemplo para exibir a quantidade de arquivos em um controle Label com ID igual a lblmsg que incluimos na página.

 protected void Page_Load(object sender, EventArgs e)
        {
            string caminho = @"c:\dados";
            string mascara = "*.*";
      
     // Le todos os arquivos de um tipo no diretorio
            DirectoryInfo arquivos = new DirectoryInfo(caminho);
      
     // Pega todas as imagens .gif
            lstbArquivos.DataSource = arquivos.GetFiles(mascara);
      
     // vincula os dados no listbox
            lstbArquivos.DataBind();
            lblmsg.Text = Directory.GetFiles(caminho, mascara, SearchOption.TopDirectoryOnly).Length.ToString() + " Arquivos ";
        }

Você pode melhorar o projeto permitindo que o usuário informe o caminho e nome do diretório bem como o tipo de arquivo e se a busca deve ser feita somente no diretório ou incluir também os subdiretórios.

Executando o projeto para o código acima temos:

Obs: Alterei o nome do projeto para ExibindoArquivos por ser mais pertinente ao seu objetivo.

Pegue o projeto completo aqui: ExibindoImagens.zip

Mar 3:26 e se Satanás se tem levantado contra si mesmo, e está dividido, tampouco pode ele subsistir; antes tem fim.

Mar 3:27 Pois ninguém pode entrar na casa do valente e roubar-lhe os bens, se primeiro não amarrar o valente; e então lhe saqueará a casa.

Mar 3:28 Em verdade vos digo: Todos os pecados serão perdoados aos filhos dos homens, bem como todas as blasfêmias que proferirem;

Mar 3:29 mas aquele que blasfemar contra o Espírito Santo, nunca mais terá perdão, mas será réu de pecado eterno.

Referências:


José Carlos Macoratti