Удалить папку, все подпапки и файлы

Возможный дубликат:
Рекурсивный удаление файлов и каталогов в C #

Я пытаюсь удалить все файлы и папки в корневой папке, но моя программа продолжает давать сбой, потому что некоторые файлы превышают предел 256 или что-то в этом роде.

Что мне нужно сделать, так это перейти в последнюю папку, удалить все файлы, а затем удалить эту папку и перейти к корневой папке, а затем удалить ее.

Я застрял в том, как это сделать, пожалуйста, может кто-нибудь помочь с простым способом сделать это?

большое спасибо за любую помощь

Я использую C #, код:

    private void RemoveDirectory(DirectoryInfo directory)
    {
        RemoveReadOnly(directory);

        directory.Delete(true);

        bool directoryExists = true;

        while (directoryExists)
            directoryExists = Directory.Exists(directory.FullName);

        SendProgressMessage(string.Format("Removed {0}", directory.FullName));
    }

person Sam Wrighton    schedule 15.03.2012    source источник
comment
Какой ваш код вы используете и какая именно ошибка у вас есть?   -  person Peter    schedule 15.03.2012
comment
Разместите свой код, опубликуйте детали исключения, опубликуйте что-нибудь, что мы можем рассмотреть, чтобы мы могли начать помогать. См. Написание идеального вопроса.   -  person Oded    schedule 15.03.2012
comment
Аналогичный вопрос: stackoverflow.com/questions/925192/   -  person Robar    schedule 15.03.2012
comment
@Robar: Нет, это похоже на stackoverflow.com/q/2223007/284240   -  person Tim Schmelter    schedule 15.03.2012
comment
SamWrighton: Это может быть бесконечный цикл while (directoryExists)directoryExists = Directory.Exists(directory.FullName);, поскольку Directory.Exists ничего не изменит.   -  person Tim Schmelter    schedule 15.03.2012


Ответы (3)


Чтобы удалить каталог c: \ temp:

Directory.Delete(@"c:\temp", true);

Есть ли причина, по которой вы не можете этого сделать?

person Sam I am says Reinstate Monica    schedule 21.03.2012

Вы должны использовать следующую функцию, которая обходит оболочку api (если вы ошиблись, что путь длиннее 256 символов):

[DllImport("kernel32.dll", CharSet=CharSet.Unicode, SetLastError=true)]
public static extern bool DeleteFile(string path);

А для справочников:

[DllImport("kernel32.dll", CharSet=CharSet.Unicode, SetLastError=true)]
public static extern bool RemoveDirectory(string path);

И убедитесь, что у вас есть CharSet.Unicode, ansi ограничит ваш путь на 260 (MAX_PATH).

http://msdn.microsoft.com/en-us/library/aa363915%28VS.85%29.aspx

http://msdn.microsoft.com/en-us/library/aa365488%28v=vs.85%29.aspx

Эта функция может удалять более длинные пути до 256 символов.

person Peter    schedule 15.03.2012
comment
Если это решит его проблему, ему следует использовать неуправляемые функции. Может быть, он для начала выбрал не ту проблему. - person Peter; 15.03.2012
comment
Может быть, вы правы. stackoverflow.com/a/2223040/284240 - person Tim Schmelter; 15.03.2012
comment
Я пробовал это, и он не удалил папку или какое-либо ее содержимое - person Sam Wrighton; 15.03.2012

это очень похоже на сортировку по дереву и т. д.

вам нужна рекурсивная функция, чтобы перейти к каждому из листовых узлов (папка без подпапок) и удалить все файлы в этом листе, а затем и сам лист.

базовый псевдокод:

function main()
{
    deleteNode(first node);
}

function deleteNode(node)
{
    foreach(child in node.children)
    {
        deleteNode(child);
        delete the child which should now be empty
    }

    delete all files in this node
}
person spaceman    schedule 15.03.2012