ruby 空目录(删除所有文件)

xzv2uavs  于 2022-12-12  发布在  Ruby
关注(0)|答案(9)|浏览(240)

在纯Ruby中,删除一个目录中所有文件的安全而有效的方法是什么?

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

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

  • 谢谢-谢谢
gpnt7bae

gpnt7bae1#

FileUtils.rm_rf("#{dir_path}/.", secure: true)呢?

t2a7ltrp

t2a7ltrp2#

FileUtils.rm_rf Dir.glob("#{dir_path}/*") if dir_path.present?
ogsagwnx

ogsagwnx3#

出现该错误的原因可能是当前工作目录与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
jc3wubiy

jc3wubiy4#

每个人都建议使用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

rkttyhzu

rkttyhzu5#

现在,我喜欢使用Pathname类处理文件或目录。
这应该可以让您开始:

Pathname.new(dir_path).children.each { |p| p.unlink }

unlink将删除目录或文件,因此如果您有嵌套的目录要保留,则必须对它们进行测试:
移除档案或目录,如果self是档案,请使用File.unlink,或视需要使用Dir.unlink。

ccrfmcuu

ccrfmcuu6#

要添加到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,它将尝试递归删除文件系统中的所有内容(可能受您的权限限制)。

new9mtju

new9mtju7#

铁皮人几乎得到了它的权利-但在情况下,目录不是空的使用

Pathname.new(dir_path).children.each { |p| p.rmtree }
vulvrdjw

vulvrdjw8#

如果您只有文件或空目录,下面是另一个非常简洁的变体:

your_path.children.each.map(&:unlink)
i7uq4tfw

i7uq4tfw9#

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

相关问题