空目录(删除所有文件)

时间:2011-11-22 09:06:22

标签: ruby

在纯Ruby中删除目录中所有文件的安全有效方法是什么?我写了

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

但它给了我一个No such file or directory错误。

谢谢。

8 个答案:

答案 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 != '..'}