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”. [:)]