Возможно ли сделать неостанавливаемое удаление в C #? (Компактный каркас) - PullRequest
0 голосов
/ 06 августа 2010

Учитывая папку, я хочу убедиться, что ВСЕ файлы в этом каталоге удалены.Я знаю, что там могут быть ошибки IOExceptions или Access Denied, но как просто оставить их в стороне и продолжить удаление файлов, которые я могу удалить?Это возможно?Пожалуйста, пролите немного света на то, с чего я могу начать.

Ответы [ 5 ]

3 голосов
/ 06 августа 2010

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

Редактировать: код по запросу

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){}
        }
    }
3 голосов
/ 06 августа 2010

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

2 голосов
/ 06 августа 2010

IOExceptions или Access Denied ошибки, но как просто оставить их в стороне и продолжить удаление?Если у вас проблемы с вводом-выводом или у вас нет доступа к файлам, вы не можете удалить их.Это исключения.Они говорят вам: «Эй, это пошло не так, и вот почему».Это не вежливые предупреждающие сообщения, которые вы можете просто игнорировать, это причина , с которой ваше удаление не сработало.

1 голос
/ 06 августа 2010

Ответ на вопрос рекурсивного поиска:

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

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

0 голосов
/ 06 августа 2010

Если вы немного измените порядок, предложенный @Will A, и добавите строку для удаления самого каталога - это должно сработать.Что-то вроде

        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)
            {
            }

        }

должно очистить пустые папки

...