Каким будет безопасный и эффективный способ удаления всех файлов в директории в чистом Ruby? Я написал
Dir.foreach(dir_path) {|f| File.delete(f) if f != '.' && f != '..'}
но это дает мне ошибку No such file or directory.
Спасибо.
Каким будет безопасный и эффективный способ удаления всех файлов в директории в чистом Ruby? Я написал
Dir.foreach(dir_path) {|f| File.delete(f) if f != '.' && f != '..'}
но это дает мне ошибку No such file or directory.
Спасибо.
Вероятно, вы получаете эту ошибку, потому что ваш текущий рабочий каталог не соответствует 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
Как насчет FileUtils.rm_rf("#{dir_path}/.", secure: true)?
FileUtils.rm_rf Dir.glob("#{dir_path}/*") if dir_path.present?
Все предлагают rm_rf, но безопаснее использовать rm_f, который является псевдонимом rm force: true.
FileUtils.rm_f Dir.glob("#{dir_path}/*")
Этот метод не удалит каталоги, он удалит только файлы: http://ruby-doc.org/stdlib-2.2.0/libdoc/fileutils/rdoc/FileUtils.html#method-c-rm
"Оловянный человек" почти правильно понял, но если каталоги не пустые, используйте
Pathname.new(dir_path).children.each { |p| p.rmtree }
В настоящее время мне нравится использовать класс Pathname при работе с файлами или каталогами.
Это должно помочь вам:
Pathname.new(dir_path).children.each { |p| p.unlink }
unlink удалит каталоги или файлы, поэтому, если у вас есть вложенные каталоги, которые вы хотите сохранить, вам придется протестировать их:
Удаляет файл или каталог, используя File.unlink, если self является файлом, или Dir.unlink при необходимости.
Чтобы перейти к 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, он попытается рекурсивно удалить все, что может (возможно, ограничено вашими разрешениями) в вашей файловой системе.
Dir.foreach(dir_path) {|f| File.delete("#{dir_path}/#{f}") if f != '.' && f != '..'}