Removendo subpastas. Parte 1 – usando recursos existentes.

Mostrarei, neste artigo e em um próximo, duas formas de percorrer e remover subpastas de uma pasta selecionada pelo usuário. Esse tipo de programa é muito útil quando queremos fazer uma limpeza em determinados lugares do disco.

Neste primeiro artigo, uso os recursos que o .Net Framework nos oferece, fazendo com que gastemos menos tempo com o problema.

Primeiramente, crie um novo projeto do tipo Windows Forms.

Acrescente:

  • 2 Botões:
    • no primeiro, defina as propriedades Name como “btSelecionarPasta” e Text  como “…”
    • no segundo, deixe o nome como “btRemover” e Text como “&Procurar e remover”
  • 2 TextBoxes:
    • a primeira com o nome “txtCaminho”
    • a segunda, “txtCriterio”
  • 1 ComboBox
    • nomeie como “cmbCriterios”
    • em Items, coloque, separados por uma linha, e sem aspas:  “–Selecione–“, “São iguais a”, “Começam com”, “Terminam com”, “Contém”
  • 1 CheckBox, nomeada como “chkSubpastas” e Checked = true
  • 1 ProgressBar, de nome “pgbRemovendo” e Style Marquee
  • 1 FolderBrowserDialog, com o nome “dlgSelecionarPasta”

A “cara” do programa deve ficar parecida com a próxima figura:

Agora, vamos ao código:

Acrescente a referência ao namespace System.IO:

 using System.IO;

 No evento Load do Form:

cmbCriterios.SelectedIndex = 0;

Agora, no evento Click do botão “btSelecionarPasta”, acrescente:

dlgSelecionarPasta.ShowDialog();
txtCaminho.Text = dlgSelecionarPasta.SelectedPath;

E, no evento Click do botão “btRemover”, o código principal (colocarei todo o código do evento, mas comentarei – no próprio código – apenas os trechos mais importantes):

private void btRemover_Click(object sender, EventArgs e)
{                     

    if (txtCaminho.Text.Trim() == )
    {
        MessageBox.Show(“Por favor, digite ou selecione uma pasta para procurar.”);
        txtCaminho.Focus();
        return;
    }
    else if (cmbCriterios.SelectedIndex == 0)
    {
        MessageBox.Show(“Por favor, selecione um critério na lista.”);
        cmbCriterios.Focus();
        return;
    }
    else if (txtCriterio.Text.Trim() == “”)
    {
        MessageBox.Show(“Por favor, digite um critério.”);
        txtCriterio.Focus();
        return;
    }

   /* Abaixo, verificamos se devemos apagar as pastas/arquivos que
        sejam exatamente iguais, 
        terminam, começam ou contenham  o critério selecionado.
        Repare que podemos usar caracteres curinga.  
    */

    string criterio = txtCriterio.Text;          
    switch (cmbCriterios.SelectedIndex)
    {              
        case 2:
            criterio += “*”;                  
            break;
        case 3:
            criterio = “*” + criterio;                  
            break;
        case 4:
            criterio = “*” + criterio + “*”;                  
            break;
    }

    if (MessageBox.Show(“Deseja realmente procurar e remover as pastas onde os nomes “ + cmbCriterios.Text + ” \”” + txtCriterio.Text + “\”?”,“Confirmar”, MessageBoxButtons.YesNo) == DialogResult.No)
        return;
  
    DirectoryInfo dir = new DirectoryInfo(txtCaminho.Text );

    SearchOption srcSubfolders = SearchOption.TopDirectoryOnly;

    // Se a checkbox está marcada, removeremos também as subpastas
    if (chkSubpastas.Checked)
        srcSubfolders = SearchOption.AllDirectories;        
  
    try
    {

        DirectoryInfo[] subDirs = dir.GetDirectories(criterio, srcSubfolders);
        int total = subDirs.Count();

        if (total == 0)
        {
            MessageBox.Show(“Nenhuma pasta encontrada.”);
            return;
        }

        this.Cursor = Cursors.WaitCursor;
        btRemover.Enabled = false;
        btRemover.Text = “Por favor, aguarde…”;
        pgbRemovendo.Visible = true;

        foreach (DirectoryInfo subDir in subDirs)
        {
            try
            {
                subDir.Delete(true);
            }
            catch (UnauthorizedAccessException) //caso existam arquivos marcados como readonly, mudamos a permissão para que possamos apagá-los.
            {
                foreach(FileInfo file in subDir.GetFiles(“*”,SearchOption.AllDirectories))
                {
                    file.IsReadOnly = false;
                }
                subDir.Delete(true);
            }
            this.Refresh();
        }

        pgbRemovendo.Visible = false;
        this.Cursor = Cursors.Default;
        MessageBox.Show(total.Tostring() + ” pasta(s) removida(s).”);
      
        btRemover.Enabled = true;
        btRemover.Text = “&Procurar e remover”;
      

    }
    catch (DirectoryNotFoundException)
    {
        MessageBox.Show(“Pasta inválida.”);
    }

}

No próximo artigo sobre este tema, espero postar algo, digamos, mais “primitivo”. [:)]