空目录(删除所有文件)

Pab*_*blo 26 ruby

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

Dir.foreach(dir_path) {|f| File.delete(f) if f != '.' && f != '..'}
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

Mar*_*her 69

怎么样FileUtils.rm_rf("#{dir_path}/.", secure: true)

  • FileUtils是Ruby标准库的一部分,因此,它自动包含在Ruby的安装中.它是否"核心"并不是真正的问题,因为无论哪种方式都可以使用,只需要'require'fileutils'`来使它可用. (8认同)

Myr*_*avN 22

FileUtils.rm_rf Dir.glob("#{dir_path}/*") if dir_path.present?
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,这种方法比评价最高的方法更漂亮,因为它可以让你使用 `Dir.glob` 的魔力。例如,如果您有嵌套目录并且只想删除其中的文件以保留目录树 - 请使用 FileUtils.rm_rf Dir.glob("#{dir_path}/*/*.*")`。`Dir.glob` 还将省略任何以点为前缀的文件 - 如果您想保留 `.keep` 文件,这非常方便。 (2认同)
  • 如果因为打字错误或其他错误,`dir_path` 为 `nil` 怎么办?*大部分时间 ruby​​ 代码不是以 root 身份运行的,对吗? (2认同)

sar*_*old 13

您可能会收到该错误,因为您当前的工作目录不匹配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
Run Code Online (Sandbox Code Playgroud)

  • 这很有效,非常感谢!在我的情况下,`dir_path`目录中不会有子目录,因为它用于存储临时文件.如果有目录,我想如果像`!File.directory?(fn)`那样可以在内联中添加一个条件.是对的还是我错过了什么? (2认同)

den*_*lin 7

每个人都建议rm_rf,但更安全的方法是使用rm_f,这是一个别名rm force: true.

FileUtils.rm_f Dir.glob("#{dir_path}/*")
Run Code Online (Sandbox Code Playgroud)

此方法不会删除目录,它只会删除文件:http://ruby-doc.org/stdlib-2.2.0/libdoc/fileutils/rdoc/FileUtils.html#method-c-rm