C удалить все файлы в папке
А почему бы и нет? Еслиб они находились в самом конце что то бы изменилось? так утроенна система/функция поиска.
мммм. а можна пример? в смысле работающий код? Потому как SHFileOperation обычно для этого юзается - но в таком случае никакой необходимости удалять папку нет, а вот удаление папки с файлами. или это было просто лишь бы сказать?
потому что ты ищешь все объекты. Добавь в код поиска проверку на директорию и получай только файлы
если использовать стандартные функции то папка вроде не удалиться если в ней есть файлы. А что тебе мешает удалить вызывая команды командной строки т. е. можнол исп функцию system или exec допустим нам надо удалить все файлы из папки C:\windows\temp
будет примерно след код
system("c:");
system("cd \");
system("cd windows");
system("cd temp");
system("del *.* /f /s /q");
потому-что FindFirstFile/FindNextFile проходят по таблице фат. а для каждой под-папки там 2 первіе записи - это "." и "..". Первая запись нужна для верификации содержимого подпапки с ее записью в паке на уровень выше. То-есть грубо говоря она указывает сама на себя. Вторая запись - указывает на родительский элемент.
мммм. а можна пример? в смысле работающий код? Потому как SHFileOperation обычно для этого юзается - но в таком случае никакой необходимости удалять папку нет, а вот удаление папки с файлами. или это было просто лишь бы сказать?
Я не думал, что RemoveDir и RemoveDirectory работают только с пустыми папками.:confused: Так что извиняйте. Оказалось не все так просто.
В принципе согласен с Death Knight насчет использования коммандной строки.
Только поправочка:
Это позволит удалить также все вложенные каталоги. Иначе будут удалены только все файлы во вложенных каталогах, но не сами каталоги!
Получается:
1) Запоминаем имя папки(если можно так сказать)
2) Удаляем ее
3) Создаем заново
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Удаляет заданный каталог и при необходимости все подкаталоги.
Перегрузки
Удаляет пустой каталог по заданному пути.
Удаляет заданный каталог и, при наличии соответствующей инструкции, все подкаталоги и файлы в нем.
Delete(String)
Удаляет пустой каталог по заданному пути.
Параметры
Имя пустого каталога, который необходимо удалить. Этот каталог должен поддерживать запись и быть пустым.
Исключения
Файл с тем же именем и расположении, заданном path , уже существует.
-или- Каталог является текущим рабочим каталогом приложения.
-или- Каталог, заданный параметром path , не пустой.
-или- Каталог доступен только для чтения или содержит файл, доступный только для чтения.
-или- Каталог используется другим процессом.
У вызывающего объекта отсутствует необходимое разрешение.
path имеет значение null .
Указанный путь, имя файла или оба значения превышают максимальную длину, заданную в системе.
Параметр path не существует или не найден.
-или- Указан недопустимый путь (например, он ведет на несопоставленный диск).
Примеры
В следующем примере показано, как создать каталог и подкаталог, а затем удалить только подкаталог.
Комментарии
Этот метод ведет себя идентично указанному Delete(String, Boolean) false для второго параметра.
Параметр path может указывать относительные или абсолютные сведения о пути. Относительные сведения о пути интерпретируются относительно текущего рабочего каталога. Сведения о получении текущего рабочего каталога см. в разделе GetCurrentDirectory.
Конечные пробелы удаляются из конца path параметра перед удалением каталога.
Этот метод создает исключение, IOException если каталог, указанный в параметре path , содержит файлы или подкаталоги.
Параметр path не учитывает регистр.
В некоторых случаях, если у вас есть указанный каталог, открытый в проводник, Delete метод может не иметь возможности удалить его.
См. также раздел
Применяется к
Delete(String, Boolean)
Удаляет заданный каталог и, при наличии соответствующей инструкции, все подкаталоги и файлы в нем.
Параметры
Имя каталога, который необходимо удалить.
Значение true позволяет удалить каталоги, подкаталоги и файлы по заданному path , в противном случае — значение false .
Исключения
Файл с тем же именем и расположении, заданном path , уже существует.
-или- Каталог, заданный параметром path , доступен только для чтения, или recursive имеет значение false и path не является пустым каталогом.
-или- Каталог является текущим рабочим каталогом приложения.
-или- Каталог содержит файл только для чтения.
-или- Каталог используется другим процессом.
У вызывающего объекта отсутствует необходимое разрешение.
path имеет значение null .
Указанный путь, имя файла или оба значения превышают максимальную длину, заданную в системе.
Параметр path не существует или не найден.
-или- Указан недопустимый путь (например, он ведет на несопоставленный диск).
Примеры
В следующем примере показано, как создать каталог, подкаталог и файл в подкаталоге, а затем рекурсивно удалить все новые элементы.
Комментарии
Параметр path может указывать относительные или абсолютные сведения о пути. Относительные сведения о пути интерпретируются относительно текущего рабочего каталога. Сведения о получении текущего рабочего каталога см. в разделе GetCurrentDirectory.
Конечные пробелы удаляются из конца path параметра перед удалением каталога.
Параметр path не учитывает регистр.
recursive Если параметр имеет значение true , пользователь должен иметь разрешение на запись для текущего каталога, а также для всех подкаталогов.
Поведение этого метода немного отличается при удалении каталога, содержащего точку повторного измерения, например символьную ссылку или точку подключения. Если точка повторного разбора является каталогом, например точкой подключения, она отключена и точка подключения удаляется. Этот метод не повторяется через точку повторного просмотра. Если точка повторного выполнения является символьной ссылкой на файл, точка повторного выполнения удаляется, а не целевой объект символьной ссылки.
В некоторых случаях, если у вас есть указанный каталог, открытый в проводник, Delete метод может не иметь возможности удалить его.
если в вашем каталоге может быть много файлов, EnumerateFiles() более эффективно, чем GetFiles() , потому что, когда вы используете EnumerateFiles() вы можете начать перечислять его до возвращения всей коллекции, в отличие от GetFiles() где вам нужно загрузить всю коллекцию в память, прежде чем начать перечислять ее. Смотрите эту цитату здесь:
поэтому, когда вы работаете со многими файлами и каталогами, EnumerateFiles() может быть больше эффективный.
то же самое относится к EnumerateDirectories() и GetDirectories() . Таким образом, код будет:
для целей этого вопроса действительно нет причин использовать GetFiles() и GetDirectories() .
Да, это правильный способ сделать это. Если вы хотите дать себе " чистую "(или, как я предпочитаю называть ее," пустую " функцию), вы можете создать метод расширения.
Это позволит вам сделать что-то подобное..
следующий код очистит папку рекурсивно:
мы также можем показать любовь к LINQ:
обратите внимание, что мое решение здесь не является эффективным, потому что я использую Get*().ToList().ForEach(. ) который генерирует то же самое IEnumerable два раза. Я использую метод расширения, чтобы избежать этой проблемы:
Это метод расширения:
самый простой способ:
имейте в виду, что это может уничтожить некоторые разрешения на папку.
основываясь на hiteshbiblog, вы, вероятно, должны убедиться, что файл читается и записывается.
Если вы знаете, что нет подпапок, что-то вроде этого может быть самым простым:
каждый метод, который я пробовал, они потерпели неудачу в какой-то момент с системой.Ошибки ввода-вывода. Следующий метод работает наверняка, даже если папка пуста или нет, только для чтения или нет и т. д.
следующий код очистит каталог, но оставит там корневой каталог (рекурсивный).
В Windows 7, Если вы только что создали его вручную с помощью Проводника Windows, структура каталогов похожа на эту:
и запуск кода, предложенного в исходном вопросе, для очистки каталога C:\AAA, линия di.Delete(true) всегда терпит неудачу с IOException "каталог не пуст" при попытке удалить BBB. Вероятно, это связано с какими-то задержками/кэшированием в Проводнике Windows.
Я хочу удалить все файлы и папки в папку на системный вызов.
Я могу называть так:
знаете ли вы более простой способ?
Нет, я не знаю ни одного.
если вы хотите сохранить исходный каталог по какой-либо причине (ACLs, &c.), и вместо этого очень хочется его опорожнить, тогда можно сделать следующее:
это сначала удаляет все файлы из директории, а затем рекурсивно удаляет все вложенные каталоги, но в целом сохраняя директории верхнего уровня "как есть" (за исключением содержания).
обратите внимание, что в пакетном файле вам нужно удвоить % внутри for петля:
del c:\destination\*.* /s /q работал для меня. Надеюсь, это сработает и для тебя.
Я думаю, самый простой способ сделать это:
последняя "\" в пути является важной частью.
Если имена вложенных папок могут содержать пробелы, их необходимо окружить экранированными кавычками. В следующем примере показано это для команд, используемых в пакетном файле.
да! Используйте Powershell:
удалить папку со всеми файлами в ней:
удалить все файлы из определенной папки (не удаляя саму папку) немного сложнее. del /s *.* не удается удалить папки, но удаляет файлы из всех вложенных папок. Поэтому необходимы две команды:
вы можете создать скрипт для удаления всего, что вы хотите (папка или файл), как это mydel.bat :
несколько примеров использование:
также, вероятно, хотите установить значение для переключателя повтора, /r , потому что число попыток по умолчанию равно 1 миллион.
У меня была индексная папка с 33 папками, в которых нужно было удалить все файлы и подпапки. Я открыл командную строку в папке индекса, а затем использовал следующие команды:
Я разделил их на две строки (нажмите enter после первой строки, и когда вас попросят добавить вторую строку), потому что если ввести одну строку, это может не сработать. Эта команда удалит каждый каталог, а затем создаст новый, который будет пустым, таким образом, удаляя все файлы и подпапки в оригинальный каталог.
Появилась надобность написать метод, который по указанному пути будет удалять из директории один файл. Ниже приведены варианты. Не могу решить, какой из них наиболее подходящий с точки зрения читаемости и производительности.
На скриншоте ниже показано среднее время выполнения каждого метода. Как можно заметить - последние два имеют наименьший результат.
Нужен совет. Какой из данных методов предпочтительнее использовать?
Первый метод - удаление всего в директории, все остальные делают все тоже самое, разница только в том, что где то вы сгруппировали различные методы в одну "портянку", а где то наоборот, разбили все по своим переменным. Тут вы экономите совершенно не на том. Что касается самого задания, то на кой черт вам перебор не пойму, если файл 1? Вызывайте просто File.Delete("C:\\MyFile.txt"); и будет вам счастье.
@EvgeniyZ И я плюсану, пишите. Ответ полностью на все поставленные вопросы дан: экономия на спичках, разницы толком нет, удаляется разное, непонятно зачем цикл.
1 ответ 1
Давайте разберем ваши методы:
Первый метод - Здесь вы при вызове задаете ему некий путь к директории, потом получаете всю информацию о ней (и о каждом файле) и затем уже в цикле пробегаете по всем файлам в данной директории, удаляя каждый. По сути вам не нужно знать всю информацию о директории, а значит можно от DirectoryInfo отказаться и использовать просто пути до файлов, метод в итоге будет такой:
Другие методы - Вы также при вызове задаете некий путь, получаете всю информацию о данной директории и после этого удаляете первый файл в данной директории. Все методы у вас одинаковы, разница только в том, что во втором методе вы вынесли отдельно в переменную di информацию о текущей директории; в третьем методе вы еще дополнительно вынесли информацию о файле в переменную _file ; ну а в четвертом вы вовсе все написали сплошной "портянкой". Я вам больше даже скажу, все эти методы у вас имеют серьезную ошибку (попробуйте указать путь к пустой директории).
Читаемость кода - Тут тоже, у каждого свое представление, свой стиль, я к примеру люблю минимализм, если это хорошо читается и возможно разместить в одну строку, то почему бы и нет. Пример переписанного первого метода в одну строку, (как с читаемостью?):
Правильное решение - Вы пишите:
написать метод, который по указанному пути будет удалять из директории один файл.
Так может вам проще сразу удалить файл по пути? Вызовите всего один метод File.Delete(file); , в который передаете путь до нужного файла, не нужно циклов, не нужно получать полную информацию. Если не известно имя файла, то получайте просто путь первого файла в директории (пример var file = Directory.GetFiles(path).FirstOrDefault(); ), этого будет вполне достаточно.
Читайте также: