C # excluir uma pasta e todos os arquivos e pastas dentro dessa pasta

104

Estou tentando excluir uma pasta e todos os arquivos e pastas dentro dessa pasta, estou usando o código abaixo e recebo o erro Folder is not empty, alguma sugestão sobre o que posso fazer?

try
{
  var dir = new DirectoryInfo(@FolderPath);
  dir.Attributes = dir.Attributes & ~FileAttributes.ReadOnly;
  dir.Delete();
  dataGridView1.Rows.RemoveAt(dataGridView1.SelectedRows[i].Index);
}
catch (IOException ex)
{
  MessageBox.Show(ex.Message);
}
Jamie
fonte

Respostas:

167
dir.Delete(true); // true => recursive delete
Tommy Carlier
fonte
110

Leia o manual:

Método Directory.Delete (String, Boolean)

Directory.Delete(folderPath, true);
Morfildur
fonte
68
Por que ler o manual quando é muito mais rápido pesquisar no Google e acabar aqui?
reggaeguitar
5
Isso é tão verdade
Corvin
4
Na verdade ... apenas pesquisei isso, e esse post foi o primeiro resultado do google.
MasterN8 de
2
O que eu faço às vezes é fazer a pergunta e responder eu mesmo, para ajudar futuros googlers. StackOverflow permite que você publique a pergunta e a resposta simultaneamente.
DharmaTurtle,
1
Comecei a fazer toda a minha documentação local desta forma. Não é bem um FAQ, mais como perguntas SO. ou seja, como eu faço? ou o que é isso?
Paul Duer
23

Experimentar:

System.IO.Directory.Delete(path,true)

Isso excluirá recursivamente todos os arquivos e pastas sob o "caminho", supondo que você tenha as permissões para fazer isso.

Jinsungy
fonte
6

Err, que tal ligar Directory.Delete(path, true);?

Dmitri Nesteruk
fonte
5

O método Directory.Delete tem um parâmetro booleano recursivo, ele deve fazer o que você precisa

Paolo Tedesco
fonte
4

Você deveria usar:

dir.Delete(true);

para excluir recursivamente o conteúdo dessa pasta também. Consulte Sobrecargas MSDN DirectoryInfo.Delete () .

pirocúmulo
fonte
3

Experimente isso.

namespace EraseJunkFiles
{
    class Program
    {
        static void Main(string[] args)
        {
            DirectoryInfo yourRootDir = new DirectoryInfo(@"C:\somedirectory\");
            foreach (DirectoryInfo dir in yourRootDir.GetDirectories())
                    DeleteDirectory(dir.FullName, true);
        }
        public static void DeleteDirectory(string directoryName, bool checkDirectiryExist)
        {
            if (Directory.Exists(directoryName))
                Directory.Delete(directoryName, true);
            else if (checkDirectiryExist)
                throw new SystemException("Directory you want to delete is not exist");
        }
    }
}
Rosidin Bima
fonte
0
public void Empty(System.IO.DirectoryInfo directory)
{
    try
    {
        logger.DebugFormat("Empty directory {0}", directory.FullName);
        foreach (System.IO.FileInfo file in directory.GetFiles()) file.Delete();
        foreach (System.IO.DirectoryInfo subDirectory in directory.GetDirectories()) subDirectory.Delete(true);
    }
    catch (Exception ex)
    {
        ex.Data.Add("directory", Convert.ToString(directory.FullName, CultureInfo.InvariantCulture));

        throw new Exception(string.Format(CultureInfo.InvariantCulture,"Method:{0}", ex.TargetSite), ex);
    }
}
dekdev
fonte
0

Experimente isto:

foreach (string files in Directory.GetFiles(SourcePath))
{
   FileInfo fileInfo = new FileInfo(files);
   fileInfo.Delete(); //delete the files first. 
}
Directory.Delete(SourcePath);// delete the directory as it is empty now.
Principe
fonte
Embora este código possa responder à pergunta, fornecer contexto adicional sobre como e / ou por que ele resolve o problema melhoraria o valor da resposta a longo prazo. Leia isto
Shanteshwar Inde
0

Para aqueles que estão executando a DirectoryNotFoundException, adicione esta verificação:

if (Directory.Exists(path)) Directory.Delete(path, true);
Yster
fonte