VB .NET - Calculando o tamanho de pastas/diretórios


 Neste artigo vamos recordar como usar os recursos do LINQ para obter o tamanho de uma pasta/diretório selecionado.

Hoje vamos recordar um pouco de LINQ usando recursos que foram lançados na .NET 4.0 como os métodos para Enumerar diretórios e arquivos. Todos esses métodos retornam coleções enumeráveis (IEnumerable<T>) que oferecem um melhor desempenho que os Arrays.

Então vamos usar DirectoryInfo.EnumerateDirectories e DirectoryInfo.EnumerateFiles no exemplo deste artigo para retornar uma coleção de informações de arquivos e pastas e calculando seus tamanhos usando LINQ.

Recursos Usados:

Criando o projeto Windows Forms no VS Community 2017

Abra o VS 2017 Community e crie um projeto usando a opção : Visual Basic -> Windows Classic Desktop e selecione o template Windows Forms App (.NET Framework);

Informe o nome Vbn_ArqPastas e clique em OK.

No formulário Form1.vb inclua a partir da ToolBox os controles :

Disponha os controles conforme o leiaute da figura abaixo:

Defina o seguinte namespace no formulário:

Imports System.IO

A seguir no evento Click do botão btnProcurar inclua o código para selecionar a pasta para obter informações:

 Private Sub btnProcurar_Click(sender As Object, e As EventArgs) Handles btnProcurar.Click
        ' cria um objeto FolderBrowserDialog
        Dim FolderBrowserDialog1 As New FolderBrowserDialog
        ' cria uma janela de dialogo
        With FolderBrowserDialog1
            ' Desktop é a pasta raiz no dialogo
            .RootFolder = Environment.SpecialFolder.Desktop
            ' seleciona a pata c:\ na entrada
            .SelectedPath = "c:\"
            ' exibe uma mensagem ao usuário
            .Description = "Selecione uma pasta"
            If .ShowDialog = DialogResult.OK Then
                ' atribui a seleção da pasta ao textbox
                txtLocal.Text = .SelectedPath
            End If
        End With
    End Sub

Agora no evento Click do botão de comando

 Private Sub btnObterInfo_Click(sender As Object, e As EventArgs) Handles btnObterInfo.Click
        Dim dInfo As New DirectoryInfo(txtLocal.Text)
        ' define o parâmetro booleano para false 
        ' se voce nao quiser incluir sub-pastas
        Dim tamanhoDaPasta As Long = TamanhoArquivosDiretorios(dInfo, True)
        'calcula tamanho médio dos arquivos da pasta
        Dim arquivosDaPasta As String() = Directory.GetFiles(txtLocal.Text)
        Dim media = arquivosDaPasta.Select(Function(arquivo) New FileInfo(arquivo).Length).Average()
        media = Math.Round(media / 1000000, 1)
        txtResultado.Text = ""
        txtResultado.Text += String.Format("Tamanho do Diretório em bytes : {0:N0} bytes", tamanhoDaPasta) & vbCrLf
        txtResultado.Text += String.Format("Tamanho do Diretório em KB    : {0:N2} KB ", CDbl(tamanhoDaPasta) / 1024) & vbCrLf
        txtResultado.Text += String.Format("Tamanho do Diretório em MB    : {0:N2} MB ", CDbl(tamanhoDaPasta) / (1024 * 1024)) & vbCrLf
        txtResultado.Text += vbCrLf
        txtResultado.Text += String.Format("Tamanho médio dos arquivos em MB : {0:N2} MB", media) & vbCrLf
    End Sub

Aqui estamos chamando o método TamanhoArquivosDiretorios() para obter o tamanho total do diretório selecionado.

A seguir vemos o código deste método:

   Private Function TamanhoArquivosDiretorios(ByVal dInfo As DirectoryInfo, ByVal incluirSubDir As Boolean) As Long
        ' Enumera todos os arquivos
        Dim tamanhoTotal As Long = dInfo.EnumerateFiles().Sum(Function(file) file.Length)
        ' Se for incluir subdiretorios
        If incluirSubDir Then
            ' Enumera todos os sub-diretórios
            tamanhoTotal += dInfo.EnumerateDirectories().Sum(Function(dir) TamanhoArquivosDiretorios(dir, True))
        End If
        'retorna o tamanho total
        Return tamanhoTotal
    End Function

Observe que estamos fazendo uma chamada recursiva ao método TamanhoArquivosDiretorios()

Executando o projeto e selecionando uma pasta iremos obter o seguinte resultado:

Para diretórios com muitas sub-pastas e arquivos o processamento poderá se tornar muito lento. Que tal otimizar o código !!!!

Pegue o projeto completo aqui : Vbn_ArqPastas.zip

E a vida eterna é esta: que te conheçam, a ti só, por único Deus verdadeiro, e a Jesus Cristo, a quem enviaste. 
João 17:3

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 Visual Studio ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET ?

 

Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti