C# - Mesclando diretórios


Hoje veremos como mesclar o conteúdo de dois diretórios usando a linguagem C#.

Vamos criar um pequeno programa na linguagem C# que vai permitir mesclar o conteúdo de dois diretórios selecionados.

Basicamente vamos mover os arquivos da pasta de origem para a pasta de destino, e, se houver um arquivo com mesmo nome, será anexado um número ao final do nome do arquivo para indicar que o arquivo já existia com o mesmo nome. Assim se já existir um arquivo com o nome de Teste.txt ele será movido e renomeado para Teste(1).txt.

Vejamos isso funcionando na prática.

Criando o projeto Windows Forms

Vamos criar um vou criar um projeto Windows Desktop usando o template Windows Forms App(.NET Framework)  usando o VS 2017 Community com o nome Mesclando_Diretorios;

A partir da ToolBox inclua no formulário Form1.cs os controles:

Vamos definir o código do formulário.

Nos eventos Click dos botões btnProcurarOrigem e btnProcurarDestino vamos invocar o método Procurar passando a caixa de texto para receber a seleção do diretório feita pelo usuário usando o FolderBrowserDialog :

       private void btnProcurarOrigem_Click(object sender, EventArgs e)
        {
            Procurar(txtDiretorioOrigem);
        }
        private void btnProcurarDestino_Click(object sender, EventArgs e)
        {
            Procurar(txtDiretorioDestino);
        }    

O código do método Procurar(Control ctrl) é visto a seguir:

        private void Procurar(Control ctrl)
        {
            FolderBrowserDialog fbd1 = new FolderBrowserDialog();
            DialogResult resultado = fbd1.ShowDialog();
            // Define as propriedades do controle FolderBrowserDialog
            fbd1.Description = "Selecione uma pasta";
            fbd1.RootFolder = Environment.SpecialFolder.MyComputer;
            fbd1.ShowNewFolderButton = true;
            // Exibe a caixa de diálogo
            if (resultado == DialogResult.OK)
            {
                // Exibe a pasta selecionada
                ctrl.Text = fbd1.SelectedPath;
            }
        }  

No evento Click do botão Mesclar temos o código que valida a entrada do usuário e invoca o método MesclaDiretorios() :

        private void btnMesclar_Click(object sender, EventArgs e)
        {
            if(Validacao(txtDiretorioOrigem.Text, txtDiretorioDestino.Text))
            {
                MesclaDiretorios(txtDiretorioOrigem.Text, txtDiretorioDestino.Text);
            }
        }

O código do método MesclaDiretorios() é dado abaixo:

       private void MesclaDiretorios(string origem, string destino)
        {
            // Verifica se os diretórios terminam com \
            if (!origem.EndsWith("\\"))
            {
                origem += "\\";
            }

            if (!destino.EndsWith("\\"))
            {
                destino += "\\";
            }

            // Move os arquivos
            Cursor = Cursors.WaitCursor;
            Refresh();
            int numero_movidos = 0;
            int numero_renomeados = 0;
            foreach (string nome_antigo in Directory.GetFiles(origem))
            {
                // Compoe o novo nome do arquivo
                FileInfo info = new FileInfo(nome_antigo);
                string novo_nome = destino + info.Name;

                // Se o arquivo ja existir anexa um número indicando que o arquivo ja existia
                if (File.Exists(novo_nome))
                {
                    string extensao = info.Extension;
                    string nome_abreviado = info.Name.Substring(0,info.Name.Length - extensao.Length);

                    for (int i = 1; File.Exists(novo_nome); i++)
                    {
                        novo_nome = destino + nome_abreviado + " (" + i.ToString() + ")" + extensao;
                    }
                    numero_renomeados++;
                }
                // Move o arquivo.
                File.Move(nome_antigo, novo_nome);
                numero_movidos++;
            }

            // Exibe o resultado
            Cursor = Cursors.Default;
            MessageBox.Show("Foram movidos " + numero_movidos + " arquivos\nRenomeados " + numero_renomeados + " arquivos");
        }   
 

Abaixo o código do método Validacao() que valida a entrada do usuário:

        private bool Validacao(string origem, string destino)
        {
            if (string.IsNullOrEmpty(origem))
            {
                MessageBox.Show("O diretório é inválido...");
                return false;
            }
            if (string.IsNullOrEmpty(destino))
            {
                MessageBox.Show("O diretório é inválido...");
                return false;
            }
            if (!Directory.Exists(origem))
            {
                MessageBox.Show("O diretório não existe...");
                return false;
            }
            if (!Directory.Exists(destino))
            {
                MessageBox.Show("O diretório não existe...");
                return false;
            }
            if (origem.ToLower() == destino.ToLower())
            {
                MessageBox.Show("Os diretórios são iguais, informe novamente",
                "Diretórios iguais", MessageBoxButtons.OK,MessageBoxIcon.Error);
                return false;
            }
            return true;
        }

Agora vamos testar o projeto.

Como diretório de origem vou usar a pasta c:\dados\Access que contém 3 arquivos conforme mostra a figura abaixo a esquerda:

A pasta de destino será a pasta c:\dados\db que contém dois arquivos sendo que o arquivo Northwind já existe na pasta de origem e portanto este arquivo deverá ser copiado tendo anexao ao seu nome o número 1:

Ao clicar no botão Mesclar vemos o resultado exibido na messagabox, onde temos 3 arquivos movidos e um renomeado:

Verificando a pasta de origem temos que ela esta vazia pois os arquivos foram movidos:

Na pasta de destino temos os arquivos copiados sendo que o arquivo Northwind(1) foi renomeado pois veio da pasta de origem e já existia na pasta de destino:

Pegue o código do projeto aqui :  Mesclando_Diretorios.zip 

"Disse-lhe, pois, Pilatos: Logo tu és rei? Jesus respondeu: Tu dizes que eu sou rei. Eu para isso nasci, e para isso vim ao mundo, a fim de dar testemunho da verdade. Todo aquele que é da verdade ouve a minha voz."
João 18:37

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