C#  -  Deletando arquivos duplicados


 Neste artigo vou mostrar como usar os recursos do namespace System.IO e deletar arquivos duplicados em uma pasta  usando a linguagem  C#.

As classes usadas para gerenciar o sistema de arquivos e realizar tarefas como mover, copiar e deletar arquivos podem ser vistas na figura abaixo:
 
FileSystemInfo - A classe base que representa qualquer objeto do sistema de arquivos.

FileInfo e File - Essas classes representam um arquivo no sistema de arquivos.

DirectoryInfo e Directory - Essas classes representam uma pasta no sistema de arquivos.

Path - Essa classe contém membros estáticos que você pode usar para manipular nomes de caminhos.

DriveInfo - Essa classe fornece propriedades e métodos que fornecem informações sobre um drive.

Quando temos que trabalhar com vários arquivos, podemos usar a classe Directory que define o método GetFiles que retorna um array de strings de todos os arquivos no diretório, e, o método GetDirectories que retorna um array de strings de todos os diretórios.

Todos esses métodos definem sobrecargas que permitem passar um padrão de pesquisa e um valor de enumeração SearchOption que permite percorrer todos os subdiretórios ou permanecer no nível superior do diretório usando o valor AllDirectories ou TopDirectoriesOnly.

O padrão de pesquisa não permite a passagem de expressões regulares permitindo apenas expressões simples usando * para qualquer caractere e ? para caracteres únicos.

Quando você percorre um diretório enorme (ou subdiretórios), os métodos GetFiles GetDirectories precisam ter o resultado completo antes que o resultado seja retornado. Uma alternativa é usar os métodos EnumerateDirectories e EnumerateFiles. Esses métodos oferecem os mesmos parâmetros para o padrão de pesquisa e opções, mas eles imediatamente começam a retornar um resultado com IEnumerable<string>.

Neste artigo vou mostrar um exemplo onde devemos criar uma programa para deletar arquivos duplicados em um diretório. Estamos considerando arquivos duplicados os arquivos que foram copiados para a mesma pasta e que terminam em - Copia. Veja a figura abaixo:

Para fazer isso teremos que percorrer um diretório e seu subdiretórios e deletar arquivos que estão duplicados.  

Recursos Usados

Criando o projeto Windows Forms

Abra o VS 2017 Community e crie um novo projeto (File-> New Project) usando a linguagem C# e o template Windows Forms App (.NET Framework).

Informe um nome a seu gosto. Eu vou usar o nome CShp_Arquivos;

No formulário Form1 do projeto inclua os seguintes controles a partir da ToolBox:

  • 1 Label - Text=Diretório
  • 1 TextBox - txtDiretorio
  • 1 Button - btnDiretorio
  • 1 Button - btnArquvos
  • 1 Button - btnDeletarDuplicados
  • 1 Lisbtox - lbArquivos

Disponha os controles conforme o leiaute da figura abaixo:

A seguir inclua no formulário os seguintes namespaces:

using System;
using System.Collections.Generic;
using System.IO;
using System.Windows.Forms;

No evento Click do botão para selecionar o diretório inclua o código abra a janela de diálogo FolderBrowserDialog :

No botão para Exibir Arquivos inclua no evento Click o código abaixo:

Agora no evento Click do botão Verificar Arquivos Duplicados temos o código que vai deletar ou apenas exibir os arquivos duplicados:

Conforme o valor marcado no checkbox - Deletar arquivos duplicados no diretorio , passamos o parâmetro true ou false para deletar ou apenas exibir.

Finamente temos o método DeletarArquivosDuplicados() que recebe o diretório e um valor booleano true ou false para deletar ou não os arquivos:

O método DeletarArquivosDuplicados percorre todos os arquivos no diretório que é passado com o primeiro argumento, percorrendo todos os subdiretórios usando a opção SearchOption.AllDirectories.

Usando a instrução foreach, o arquivo atual da iteração é comparado ao arquivo da iteração anterior. Se o nome do arquivo for o mesmo e somente o prefixo - Copia for diferente, e se o tamanho dos arquivos for igual , o arquivo copiado será excluído, invocando a instrução FileInfo.Delete.

Executando o projeto e iremos obter:

Na próxima parte do artigo veremos uma abordagem mais robusta para esse problema.

Pegue o projeto completo aqui :    CShp_Arquivos.zip

"Como está escrito : Não há um justo, nem um sequer."
Romanos 3:10

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 ?

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

 

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

 

Referências:


José Carlos Macoratti