Pergunta

Dada uma pasta, quero garantir que todos os arquivos nesse diretório sejam excluídos. Eu sei que talvez estejam com erros negados no IoExceptions ou no acesso, mas como os deixam de lado e continuam com minha exclusão dos arquivos que eu realmente posso excluir? Isso é possível? Por favor, esclareça -me sobre onde eu posso começar.

Foi útil?

Solução

Respondendo à pergunta de pesquisa recursiva:

void delete(DirectoryInfo di) {
 foreach(DirectoryInfo di2 in di.GetDirectories()) {
  delete(di2);
 }
 foreach(FileInfo fi in di.GetFiles()) {
  fi.Delete();
 }
}

... Como sugerido acima, tente ... Catch em torno de várias partes lidará com a incapacidade de excluir determinados arquivos.

Outras dicas

Se você quiser excluir todos os arquivos posso Exclua, você pode criar uma lista de arquivos (recursivamente para subdirecionas) e excluí -los separadamente, pulando os que lançam uma exceção.

Se você percorrer os arquivos no diretório e excluir cada um em uma tentativa/captura, poderá continuar mesmo após uma exceção. Se você tentar excluir o diretório inteiro, uma vez que falhar, ele falha.

Editar: Código conforme solicitado

private void DeleteFiles(DirectoryInfo Directory)
    {
        bool AllFilesDeleted = true;
        foreach(FileInfo oFile in Directory.GetFiles())
        {
            try
            {
                oFile.Delete();
            }
            catch (Exception ex) { AllFilesDeleted = false; }
        }
        foreach (DirectoryInfo oDirectory in Directory.GetDirectories())
        {
            DeleteFiles(oDirectory);
        }

        if (AllFilesDeleted)
        {
            try
            {
                Directory.Delete();
            }
            catch (Exception ex){}
        }
    }

IoExceptions ou acesso negado erros, mas como os deixa de lado e continue com minha exclusão

Huh? Se você está tendo problemas de IO ou não tem acesso aos arquivos que você não pode Exclua -os. São exceções. Eles estão dizendo a você "Ei, isso deu errado, e aqui está o porquê". Eles não são mensagens educadas de alerta que você pode simplesmente ignorar, elas são o razão Seu delete não funcionou em primeiro lugar.

Se você alterar um pouco o pedido no que @@will A sugeriu e adicionar uma linha para excluir o próprio diretório - ele deve fazer o truque. Algo como

        static void delete(DirectoryInfo di)
        {
            foreach (FileInfo fi in di.GetFiles())
            {
                try
                {
                    fi.Delete();
                }
                catch (Exception)
                {

                }
            }

            foreach (DirectoryInfo di2 in di.GetDirectories())
            {
                delete(di2);
            }
            try
            {
                di.Delete();
            }
            catch (Exception)
            {
            }

        }

deve limpar as pastas vazias

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top