在纯Ruby中删除目录中所有文件的安全有效方法是什么?我写了
Dir.foreach(dir_path) {|f| File.delete(f) if f != '.' && f != '..'}
但它给了我一个No such file or directory
错误。
谢谢。
答案 0 :(得分:67)
FileUtils.rm_rf("#{dir_path}/.", secure: true)
怎么样?
答案 1 :(得分:21)
FileUtils.rm_rf Dir.glob("#{dir_path}/*") if dir_path.present?
答案 2 :(得分:12)
您可能收到该错误,因为您当前的工作目录与dir_path
不匹配 - File.delete(f)
仅为dir_path
中的文件提供了文件名。 (我希望当前工作目录中没有任何重要文件在dir_path
目录中具有相同的名称。)
您需要使用File.join(dir_path, f)
来构建您要删除的文件名。您还需要弄清楚如何处理目录:
Dir.foreach(dir_path) do |f|
fn = File.join(dir_path, f)
File.delete(fn) if f != '.' && f != '..'
end
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
答案 3 :(得分:7)
每个人都建议使用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
答案 4 :(得分:3)
Tin Man几乎把它弄好了 - 但是如果目录不是空的,请使用
Pathname.new(dir_path).children.each { |p| p.rmtree }
答案 5 :(得分:2)
现在,我喜欢在处理文件或目录时使用Pathname类。
这应该让你开始:
Pathname.new(dir_path).children.each { |p| p.unlink }
unlink
将删除目录或文件,因此,如果您希望保留嵌套目录,则必须对其进行测试:
删除文件或目录,如果self是文件,则使用File.unlink;如果需要,使用Dir.unlink删除。
答案 6 :(得分:2)
要使用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
中,它将尝试以递归方式删除文件系统中的所有内容(可能受你的权限限制)。
答案 7 :(得分:-1)
Dir.foreach(dir_path) {|f| File.delete("#{dir_path}/#{f}") if f != '.' && f != '..'}