Удалить папку, если она пустая, используя C # - PullRequest
3 голосов
/ 16 ноября 2011

Я пишу инструмент, который позволит мне пройти через довольно большой список каталогов и подкаталогов.Я хотел бы удалить папку, если там она пуста.Я могу удалить папки и подпапки, которые являются пустыми, с помощью этого кода:

string dir = textBox1.Text;
string[] folders = System.IO.Directory.GetDirectories(dir, "*.*", System.IO.SearchOption.AllDirectories);
foreach (var directory in folders)
{
    if (System.IO.Directory.GetFiles(directory).Length == 0 && System.IO.Directory.GetDirectories(directory).Length == 0)
    {
        System.IO.StreamWriter Dfile = new System.IO.StreamWriter(newpath, true);
        System.IO.Directory.Delete(directory);
    }
}

Мой вопрос заключается в том, как сделать так, чтобы код работал и проверял папки после каждого удаления, поскольку после удаления папки он можетродительская папка пуста и должна быть удалена.Если код не находит пустые папки или подпапки, он завершается.

Ответы [ 5 ]

7 голосов
/ 16 ноября 2011

Напишите рекурсивную функцию первой глубины. После завершения каждого рекурсивного вызова проверьте текущую папку, чтобы убедиться, что она пустая. Если это так, то удалите его.

Примерно так (псевдокод)

DeleteEmptyFolders(path)
{
  foreach Folder f in Path
  {
    DeleteEmptyFolders(f);

    if (f is empty)
    {
       Delete(f);
    }
  }
}
1 голос
/ 16 ноября 2011

Вы можете сделать это рекурсивно следующим образом (не проверено):

void DeleteFolder(string folder) {
    string[] folders = System.IO.Directory.GetDirectories(folder, "*.*", System.IO.SearchOption.AllDirectories);
    foreach (var directory in folders)
    {
        DeleteFolder(directory);
    }

    //delete this folder if empty
}
0 голосов
/ 22 мая 2013

это удалит все пустые (вложенные) папки в данном каталоге

https://stackoverflow.com/a/16688997/2408998

0 голосов
/ 02 февраля 2013

Судя по всему, вы пытаетесь удалить любую папку, в которой нет файла. Я верю, что это поможет тебе. Я протестировал его с небольшим набором папок глубиной в 5 уровней и одним файлом в нескольких местах. Все папки, в которых не было файлов, были удалены. Все файлы остались без изменений. Небольшая настройка найденного фрагмента ... Спасибо, Мэтт Смит. Невозможно удалить каталог с помощью Directory.Delete (путь, истина)

string[] dirs = System.IO.Directory.GetDirectories(Directory.GetCurrentDirectory(), "*.*",SearchOption.AllDirectories);
            foreach (string d in dirs)
            {
                if (System.IO.Directory.Exists(d)) {
                    if (System.IO.Directory.GetFiles(d, "*.*", SearchOption.AllDirectories).Length == 0)
                    {
                        DeleteDirectory(d);
                    }
                }
            }

    public static void DeleteDirectory(string target_dir)
    {
        string[] dirs = Directory.GetDirectories(target_dir);

        foreach (string dir in dirs)
        {
            DeleteDirectory(dir);
        }

        Directory.Delete(target_dir, false);
    }
0 голосов
/ 16 ноября 2011

Вот идея (это не проверено)

            while ( true )
            {
                DirectoryInfo parent = Directory.GetParent(current.FullName);
                if ( parent.GetFiles().Length == 0 && parent.GetDirectories().Length == 0 )
                {
                    current = parent;
                    current.Delete();
                }
                else
                {
                    break;
                }

            }

Это перемещается вверх по дереву текущего каталога, чтобы удалить все родительские каталоги, которые пусты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...