VB .NET - Pesquisando Drivers, Diretórios e Arquivos


 Neste artigo eu vou mostrar como podemos pesquisar os drivers do sistema, seus respectivos diretórios e arquivos usando a linguagem VB .NET em uma aplicação Windows Forms.


O Visual Basic 6 já teve o seu momento de glória e já cumpriu o seu papel. Deixando toda a polêmica de lado, o VB6 trazia recursos que facilitava muito a vida do desenvolvedor de aplicações para Windows.

 

Um exemplo prático são os controles DriveListBox, DirListBox e FileListBox para tratar drivers, diretórios e arquivos. Vamos lembrar o que faz cada um deles:

  1. DriveListBox - Exibe todos os drivers do seu computador;

  2. DirListBox - Exibe todos os subdiretórios de um dado diretório;

  3. FileListBox - Exibe os arquivos de um diretório particular;

Usando os 3 controles em conjunto podemos criar um pequeno projeto para localizar arquivos em um determinado diretório e em um determinado drive de maneira bem simples usando somente 3 linhas de código.

 

Veja abaixo a figura desse projeto feito a título de ilustração no Visual Basic 6 à sua esquerda e na imagem à direita o projeto em execução:

 

 

O velho e bom Visual Basic 6 dava conta do recado...


Nota: No VB6 podíamos usar também o objeto FileSystemObject para tratar arquivos, pastas e drives.

 

Mas porque eu estou falando tudo isso em um artigo que trata do VB .NET ?

 

No VB .NET esses controles não estão disponíveis e neste artigo eu vou mostrar como podemos obter o mesmo resultado usando pouco código (não tanto como no VB6).

Recursos usados:

Criando o projeto no Visual Studio 2013 Express for windows desktop

Abra o VS 2013 Express for windows desktop e clique em New Project;

Selecione a linguagem Visual Basic e o template Windows Forms Application;

Informe o nome Driver_Diretorio_Arquivos e clique no botão OK;

No formulário form1.vb criado por padrão no projeto vamos incluir a partir da ToolBox os seguintes controles:

Disponha os controles conforme o leiaute da figura abaixo:

Agora vamos definir o código do formulário iniciando com a declaração do namespace System.IO no início do formulário:

Imports System.IO

Agora no evento Load do formulário form1.vb vamos definir o código abaixo: 

 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        For Each drv As DriveInfo In DriveInfo.GetDrives
            lbDrives.Items.Add(drv)
        Next

End Sub

O código utiliza um laço for each para percorrer os drivers do sistema obtidos pelo método GetDrivers da classe DriveInfo. Essa classe fornece acesso a informações em uma unidade.

Cada drive é então exibido no controle ListBox - lbDrives.

Vamos então usar o evento SelectedIndexChanged do controle lbDrives para que quando houver qualquer alteração na seleção do drive possamos obter informações dos diretórios existentes no drive selecionado.

Para isso vamos incluir o código a seguir neste evento:

 Private Sub lbDrives_SelectedIndexChanged(sender As Object, e As EventArgs) Handles lbDrives.SelectedIndexChanged
        lbDiretorios.Items.Clear()
        Try
            Dim drv As DriveInfo = DirectCast(lbDrives.SelectedItem, DriveInfo)
            For Each dirinfo As DirectoryInfo In drv.RootDirectory.GetDirectories
                lbDiretorios.Items.Add(dirinfo)
            Next
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

A primeira linha de código do evento limpa os itens da listbox.

A seguir obtemos a informação do drive selecionado a partir da classe DriveInfo. Para isso temos que usar o operador DirectCast para converter o drive selecionado para o tipo DriveInfo.

Lembrando que  DirectCast requer que o tipo em tempo de execução de uma variável objeto seja o mesmo que o tipo especificado para conversão. Se o tipo definido e o tipo da expressão em tempo de execução forem o mesmo , o desempenho de DirectCast é melhor do que o de Ctype.

Então , se você tem certeza de que a expressão é do mesmo tipo para o qual a conversão vai ser realizada use DirectCast ; se tiver dúvidas use Ctype.

Após obter o drive usamos um laço for each para percorrer os diretórios obtidos pelo método GetDirectories da propriedade RootDirectory. Essa propriedade obtém o diretório raiz de um drive.

Os diretórios são então exibidos no controle ListBox - lbDiretorios.

Usando o mesmo raciocínio vamos usar o evento SelectedIndexChanged do controle lbDiretorios de forma a obter os arquivos de um diretório selecionado quando ocorrer alteração na seleção do diretório no controle lbDiretorios.

Inclua então o código abaixo neste evento:

    Private Sub lbDiretorios_SelectedIndexChanged(sender As Object, e As EventArgs) Handles lbDiretorios.SelectedIndexChanged
        lbArquivos.Items.Clear()
        Try
            Dim dir As DirectoryInfo = DirectCast(lbDiretorios.SelectedItem, DirectoryInfo)
            For Each arq As FileInfo In dir.GetFiles
                lbArquivos.Items.Add(arq)
            Next
        Catch unex As UnauthorizedAccessException
            MessageBox.Show("Acesso não autorizado")
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

A primeira linha de código do evento limpa os itens da listbox.

A seguir obtemos a informação do diretório selecionado a partir da classes DirectoryInfo. Para isso temos que usar o operador DirectCast para converter o diretório selecionado para o tipo DirectoryInfo.

Após obter o diretório usamos um laço for each para percorrer os arquivos obtidos pelo método GetFiles da classe DirectoryInfo.

Os diretórios são então exibidos no controle ListBox - lbArquivos.

Aqui estou tratando a exceção UnauthorizedAccessException para casos de falta de autorização de acesso a um diretório.

Executando o projeto iremos obter o seguinte resultado:

Eu fui muito minimalista neste projeto pois o meu objetivo era obter o mesmo resultado que o VB6. Você pode incluir mais funcionalidades nele.

Pegue o projeto completo aqui:  Drive_Diretorio_Arquivos.zip

E Deus limpará de seus olhos toda a lágrima; e não haverá mais morte, nem pranto, nem clamor, nem dor; porque já as primeiras coisas são passadas.
Apocalipse 21:4

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 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti