Подтвердить что ты не робот

Пустой каталог (удалить все файлы)

Каким будет безопасный и эффективный способ удаления всех файлов в директории в чистом Ruby? Я написал

Dir.foreach(dir_path) {|f| File.delete(f) if f != '.' && f != '..'}

но это дает мне ошибку No such file or directory.

Спасибо.

4b9b3361

Ответ 1

Вероятно, вы получаете эту ошибку, потому что ваш текущий рабочий каталог не соответствует dir_path - File.delete(f), и ему предоставляется только имя файла для файла в dir_path. (Надеюсь, у вас не было никаких важных файлов в текущем рабочем каталоге с одинаковыми именами в каталоге dir_path.)

Вам нужно использовать File.join(dir_path, f) для создания имени файла, который вы хотите удалить. Вам также нужно выяснить, как вы хотите обрабатывать каталоги:

> Dir.foreach(dir_path) {|f| fn = File.join(dir_path, f); File.delete(fn) if f != '.' && f != '..'}
Errno::EISDIR: Is a directory - /tmp/testing/blubber
    from (irb):10:in `delete'
    from (irb):10
    from (irb):10:in `foreach'
    from (irb):10
    from :0

Ответ 2

Как насчет FileUtils.rm_rf("#{dir_path}/.", secure: true)?

Ответ 3

FileUtils.rm_rf Dir.glob("#{dir_path}/*") if dir_path.present?

Ответ 5

"Оловянный человек" почти правильно понял, но если каталоги не пустые, используйте

Pathname.new(dir_path).children.each { |p| p.rmtree }

Ответ 6

В настоящее время мне нравится использовать класс Pathname при работе с файлами или каталогами.

Это должно помочь вам:

Pathname.new(dir_path).children.each { |p| p.unlink }

unlink удалит каталоги или файлы, поэтому, если у вас есть вложенные каталоги, которые вы хотите сохранить, вам придется протестировать их:

Удаляет файл или каталог, используя File.unlink, если self является файлом, или Dir.unlink при необходимости.

Ответ 7

Чтобы перейти к MyroslavN, если вы хотите сделать это с помощью Pathname (например, с Rails.root, если это приложение rails), вы хотите:

FileUtils.rm_rf Dir.glob(Rails.root.join('foo', 'bar', '*'))

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

Rails.root.join('foo', 'bar', '/*')

Что оценивается как /*, потому что он видит его как корневой путь. И если вы поместите это в FileUtils.rm_rf Dir.glob, он попытается рекурсивно удалить все, что может (возможно, ограничено вашими разрешениями) в вашей файловой системе.

Ответ 8

Dir.foreach(dir_path) {|f| File.delete("#{dir_path}/#{f}") if f != '.' && f != '..'}