Каким будет безопасный и эффективный способ удаления всех файлов в директории в чистом 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 != '..'}