none
Deleta Arquivos RRS feed

  • Pergunta

  • Estou tentando criar um botão para que ele verifique todos os arquivos de uma pasta e suas subpastas e exclua apenas os arquivos de determinada extensão. porém já bati cabeça e não consegui nenhum resultado. Alguém teria alguma solução?

    quinta-feira, 6 de julho de 2017 17:30

Respostas

  • Boa tarde!

    Segue abaixo um exemplo simples que eu fiz:

    private void ListarDiretorios(string pPath)
            {
                DirectoryInfo di = new DirectoryInfo(pPath);
                string pPattern = "*.png";
    
                //Lista os diretorios que tem dentro do diretório que você passou por parâmetro
                foreach (var item in di.GetDirectories())
                {
                    //se possui algum diretório dentro, o método será chamado novamente
                    if (item.GetDirectories().Count() > 0)
                    {
                        pPath = item.FullName;
                        ListarDiretorios(pPath);
                    }
    
                    //caso não seja um direório, sera feita a listagem de todos os arquivos PNG que a pasta possui
                    var files = item.GetFiles(pPattern);
                    if (files.Count() > 0)
                    {
                        foreach (var file in files)
                        {
                            //exclusão do arquivo
                            file.Delete();
                        }
                    }
                }
            }

    Só chamar esse método, passando o diretório que você precisa.

    Qualquer dúvida, estou a disposição.

    att.

    Felipe

    quinta-feira, 6 de julho de 2017 19:57

Todas as Respostas

  • Boa tarde!

    Segue abaixo um exemplo simples que eu fiz:

    private void ListarDiretorios(string pPath)
            {
                DirectoryInfo di = new DirectoryInfo(pPath);
                string pPattern = "*.png";
    
                //Lista os diretorios que tem dentro do diretório que você passou por parâmetro
                foreach (var item in di.GetDirectories())
                {
                    //se possui algum diretório dentro, o método será chamado novamente
                    if (item.GetDirectories().Count() > 0)
                    {
                        pPath = item.FullName;
                        ListarDiretorios(pPath);
                    }
    
                    //caso não seja um direório, sera feita a listagem de todos os arquivos PNG que a pasta possui
                    var files = item.GetFiles(pPattern);
                    if (files.Count() > 0)
                    {
                        foreach (var file in files)
                        {
                            //exclusão do arquivo
                            file.Delete();
                        }
                    }
                }
            }

    Só chamar esse método, passando o diretório que você precisa.

    Qualquer dúvida, estou a disposição.

    att.

    Felipe

    quinta-feira, 6 de julho de 2017 19:57
  • private void DeleteFilesInTree(string dirPath, string searchPattern)
    {
        string[] filesFound = Directory.GetFiles(dirPath, searchPattern, SearchOption.AllDirectories);
        List<string> errorFiles = new List<string>();
    
        foreach (string item in filesFound)
        {
            try
            {
                File.Delete(item);
            }
            catch (Exception ex)
            {
                errorFiles.Add($"Arquivo: {Path.GetFileName(item)}, teve o seguinte erro durante o procedimento: {ex.Message}");
            }
        }
    
        if (errorFiles.Count > 0)
        {
            foreach (string item in errorFiles)
            {
                MessageBox.Show(item);
            }
        }
    }

    O código acima usa o método GetFiles() da classe estática Directory para obter todos os arquivos de uma pasta, e das subpastas dessa pasta que obedeçam a certo critério.

    Onde "dirPath", é o caminho da pasta (Caminho completo). Onde "searchOption", é basicamente o nome do arquivo pelo qual deseja buscar. No seu caso, como você se importa apenas com a extenção, você pode usar uma string assim: "*.extensão". O "*", significa Todos, portanto, você não se preocupa com o nome do arquivo, e sim com a extensão.

    Usamos um try catch para tentar deletar o arquivo, se não der certo, pegamos a exceção ocorrida, o nome do arquivo, e adicionamos a um List chamado errorFiles. Após a tentativa de exclusão dos arquivos, verificamos se o tamanho desse List é maior que 0, se for, sabemos que algo deu errado e precisamos mostrar ao usuário qual arquivo e qual erro ocorreu durante o processo.

    Só mais uma ultima coisa, já tive algumas dores de cabeça ao lidar com o método GetFiles() para que ele procure arquivos em subdiretórios. Isso porque, você pode passar o caminho de uma pasta, porém, essa pasta pode conter subpastas ReadOnly, ou que o usuário que executou o programa não tem permissão para manipular. Nesse caso, seria bom usar um try catch na hora de obter esses arquivos com o GetFiles() também.

    • Editado Cliffinho sexta-feira, 7 de julho de 2017 15:00
    sexta-feira, 7 de julho de 2017 14:57
  • Boa tarde,

    Por falta de retorno, essa thread está sendo encerrada.

    Se necessário, favor abrir uma nova thread.

    Atenciosamente,

    Filipe B de Castro

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    terça-feira, 11 de julho de 2017 17:28
    Moderador