VB .NET - Renomeando pastas
 Neste artigo vou mostrar como podemos renomear pastas usando a linguagem VB .NET.

Você já precisou alterar o nome de diversas pastas que iniciam com um determinado caractere ?

Vamos supor que você salvou diversos arquivos em pastas e essas pastas foram geradas iniciando com o caractere _ . Exemplo: _pasta1, _pasta2, pasta2, etc...

Quando você tem dezenas ou centenas de pastas nessa situação renomear o nome das pastas manualmente pode ser tedioso.

Vou mostrar como podemos criar uma pequena aplicação usando VB .NET que faz esse trabalho.

Essa aplicação vai fazer o seguinte:

Como o projeto foi desenvolvido para atender uma demanda ele foi feito a toque de caixa e vai precisar ser otimizado.

A otimização eu vou deixar a cargo de cada de um de vocês...

Então ao trabalho...

Recursos usados:

Criando o projeto no Visual Studio 2017 Community

Abra o Visual Studio Community 2017 e clique em New Project;

Selecione Visual Basic, o template Windows Classic Desktop e a seguir Windows Forms App(.NET Framework);

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

A seguir inclua no formulário padrão Form1.vb os seguintes controles:

Disponha os controles conforme o leiaute da figura abaixo:

Definindo o código do formulário

1- Evento Load do formulário

No evento Load do formulário vamos definir o código abaixo que define os valores dos caracteres que serão usados na alteração de nome das pastas:

 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.Text = My.Application.Info.AssemblyName.ToString & " - Macoratti .net"
        txtPasta.Text = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures).ToString
        txtCaractereLocalizar.Text = "_"
        txtCaractereSubstituir.Text = "-"
    End Sub

Esse será o modelo de domínio da nossa aplicação.

2- Evento Click do botão Selecionar Pasta

Vamos incluir no evento Click do botão Selecionar Pasta o código que permite o usuário escolhar uma pasta:

Private Sub btnSelecionarPasta_Click(sender As Object, e As EventArgs) Handles btnSelecionarPasta.Click
        Using oFolderBrowserDialog As New FolderBrowserDialog
            If oFolderBrowserDialog.ShowDialog = Windows.Forms.DialogResult.OK Then
                If oFolderBrowserDialog.SelectedPath.Length > 0 Then
                    txtPasta.Text = oFolderBrowserDialog.SelectedPath
                End If
            End If
        End Using
    End Sub

3- Evento Click do botão Iniciar

No evento Click do botão Iniciar temos o código que vai invocar o método EncontrarRenomearArquivos() :

 Private Sub btnIniciar_Click(sender As Object, e As EventArgs) Handles btnIniciar.Click
        Dim caractere_Valido As Boolean = False
        If Not txtCaractereSubstituir.Text.Contains("\") Then
            caractere_Valido = True
        End If
        If caractere_Valido = True Then
            If EncontrarRenomearArquivos(txtPasta.Text, "*" & txtCaractereLocalizar.Text & "*") Then
                MessageBox.Show("Operação concluída com sucesso...")
                Process.Start("explorer.exe", txtPasta.Text)
            Else
                MessageBox.Show("Não foi possível realizar a operação ...")
            End If
        End If
    End Sub

3- Código do método EncontrarRenomearArquivos

Abaixo temos o código do método EncontrarRenomearArquivos:

 Private Function EncontrarRenomearArquivos(Optional caminhoDiretorio As String = "c:\dados\teste\", 
Optional StringAProcurar As String = "*.txt") As Boolean
        Dim caminhoValido As Boolean = True
        '----------------------------------------------
        ' VERIFICA SE CAMINHO É VÁLIDO
        '----------------------------------------------
        'remove espaco antes e depois
        caminhoDiretorio = Trim(caminhoDiretorio)
        'verifica se o tamanho é zero
        If Not Len(caminhoDiretorio) > 0 Then
            caminhoValido = False
        End If
        'verifica se o caractere é válido
        ' \ * | : ? < > / exceto o \ que o separador de pasta
        ' e * que indica para ignorar tudo dentro de outros chars
        If InStr(caminhoDiretorio, "|", CompareMethod.Binary) > 0 Then
            caminhoValido = False
        End If
        If InStr(caminhoDiretorio, ">", CompareMethod.Binary) > 0 Then
            caminhoValido = False
        End If
        If InStr(caminhoDiretorio, "<", CompareMethod.Binary) > 0 Then
            caminhoValido = False
        End If
        If InStr(caminhoDiretorio, "?", CompareMethod.Binary) > 0 Then
            caminhoValido = False
        End If
        If InStr(caminhoDiretorio, ":", CompareMethod.Binary) = 2 Then
            Dim str_temp As String = caminhoDiretorio.Substring(2, Len(caminhoDiretorio) - 2)
            If InStr(str_temp, ":", CompareMethod.Binary) > 0 Then
                caminhoValido = False
            End If
        End If
        If InStr(caminhoDiretorio, "*", CompareMethod.Binary) > 0 Then
            caminhoValido = False
        End If
         Dim SegurancaValida As Boolean = True
        '------------------------------------------Código comentado---------------------------------
        ' este código inclui mais segurança ao processo permitindo que somente usuários pertencente
        ' ao grupo dos administradores possam realizar essa operação
        '---------------------------------------------------------------------------------------------------------
        'Dim oDirectorySecurity As System.Security.AccessControl.DirectorySecurity
        'Dim oAuthorizationRuleCollection As System.Security.AccessControl.AuthorizationRuleCollection
        'Dim oRule As System.Security.AccessControl.FileSystemAccessRule
        
        'oDirectorySecurity = IO.Directory.GetAccessControl(caminhoDiretorio)
        'oAuthorizationRuleCollection = oDirectorySecurity.GetAccessRules(
        '    True, True, Type.GetType("System.Security.Principal.NTAccount"))
        'For Each oRule In oAuthorizationRuleCollection
        '    If oRule.FileSystemRights = Security.AccessControl.FileSystemRights.FullControl Then
        '        If InStr(oRule.IdentityReference.Value, My.User.Name) > 0 Then
        '            SegurancaValida = True
        '        End If
        '    End If
        'Next
        Dim Is_Pasta_Atalho As Boolean = False
        If caminhoDiretorio.StartsWith("c:\Users", True, System.Globalization.CultureInfo.CurrentCulture) Then
            Is_Pasta_Atalho = True
        End If
        If caminhoValido = True And SegurancaValida = True Then
            For Each diretorioEncontrado As String In My.Computer.FileSystem.GetDirectories(caminhoDiretorio, 
FileIO.SearchOption.SearchTopLevelOnly, StringAProcurar)
                Dim aArray() As String = diretorioEncontrado.Split("\")
                Dim Pasta1 As String = aArray(aArray.Length - 1)
                Dim Pasta2 As String = Pasta1.Replace(txtCaractereLocalizar.Text, txtCaractereSubstituir.Text)
                Try
                    My.Computer.FileSystem.RenameDirectory(diretorioEncontrado, Pasta2)
                Catch ex1 As System.IO.PathTooLongException
                    MessageBox.Show("Erro " & ex1.Message)
                Catch ex As Exception
                    MessageBox.Show("Erro " & ex.Message)
                End Try
            Next

            If chkIncluiSubPasta.Checked = True Then
                For Each diretorioEncontrado As String In My.Computer.FileSystem.GetDirectories(
                    caminhoDiretorio, FileIO.SearchOption.SearchTopLevelOnly)
                    EncontrarRenomearArquivos(diretorioEncontrado, StringAProcurar) ' busca recursiva
                Next
            End If
            Return True
        Else
            MessageBox.Show("caminhoValido =" & caminhoValido & vbCrLf & "SegurancaValida =" & SegurancaValida)
            Return False
        End If
    End Function

Executando um projeto e usando a pasta c:\dados\teste para verificar a aplicação temos abaixo o resultado obtido onde renomeamos as pastas que iniciavam com o caractere _ trocando-o pelo caractere -.

O código do projeto precisa ser otimizado.

Que tal praticar as boas práticas e ajeitar o código ???

Pegue o projeto completo aqui :  Vbn_Renomear.zip

(Disse Jesus)"Mas a hora vem, e agora é, em que os verdadeiros adoradores adorarão o Pai em espírito e em verdade; porque o Pai procura a tais que assim o adorem."
João 4:23

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