在纯Ruby中,删除一个目录中所有文件的安全而有效的方法是什么?
Dir.foreach(dir_path) {|f| File.delete(f) if f != '.' && f != '..'}
但是它给了我一个No such file or directory错误。
No such file or directory
gpnt7bae1#
那FileUtils.rm_rf("#{dir_path}/.", secure: true)呢?
FileUtils.rm_rf("#{dir_path}/.", secure: true)
t2a7ltrp2#
FileUtils.rm_rf Dir.glob("#{dir_path}/*") if dir_path.present?
ogsagwnx3#
出现该错误的原因可能是当前工作目录与dir_path不匹配--File.delete(f)只是被赋予了dir_path中某个文件的文件名(希望当前工作目录中没有任何重要文件与dir_path目录中的文件同名)。你需要使用File.join(dir_path, f)来构造你想要删除的文件名。你还需要弄清楚你想要如何处理目录:
dir_path
File.delete(f)
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
jc3wubiy4#
每个人都建议使用rm_rf,但更安全的方法是使用rm_f,它是rm force: true的别名。
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
rkttyhzu5#
现在,我喜欢使用Pathname类处理文件或目录。这应该可以让您开始:
Pathname.new(dir_path).children.each { |p| p.unlink }
unlink将删除目录或文件,因此如果您有嵌套的目录要保留,则必须对它们进行测试:移除档案或目录,如果self是档案,请使用File.unlink,或视需要使用Dir.unlink。
unlink
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,它将尝试递归删除文件系统中的所有内容(可能受您的权限限制)。
/*
FileUtils.rm_rf Dir.glob
new9mtju7#
铁皮人几乎得到了它的权利-但在情况下,目录不是空的使用
Pathname.new(dir_path).children.each { |p| p.rmtree }
vulvrdjw8#
如果您只有文件或空目录,下面是另一个非常简洁的变体:
your_path.children.each.map(&:unlink)
i7uq4tfw9#
Dir.foreach(dir_path) {|f| File.delete("#{dir_path}/#{f}") if f != '.' && f != '..'}
9条答案
按热度按时间gpnt7bae1#
那
FileUtils.rm_rf("#{dir_path}/.", secure: true)
呢?t2a7ltrp2#
ogsagwnx3#
出现该错误的原因可能是当前工作目录与
dir_path
不匹配--File.delete(f)
只是被赋予了dir_path
中某个文件的文件名(希望当前工作目录中没有任何重要文件与dir_path
目录中的文件同名)。你需要使用
File.join(dir_path, f)
来构造你想要删除的文件名。你还需要弄清楚你想要如何处理目录:jc3wubiy4#
每个人都建议使用
rm_rf
,但更安全的方法是使用rm_f
,它是rm force: true
的别名。此方法不会移除目录,只会移除档案:http://ruby-doc.org/stdlib-2.2.0/libdoc/fileutils/rdoc/FileUtils.html#method-c-rm
rkttyhzu5#
现在,我喜欢使用Pathname类处理文件或目录。
这应该可以让您开始:
unlink
将删除目录或文件,因此如果您有嵌套的目录要保留,则必须对它们进行测试:移除档案或目录,如果self是档案,请使用File.unlink,或视需要使用Dir.unlink。
ccrfmcuu6#
要添加到MyroslavN,如果您想使用Pathname(就像使用Rails.root,如果它是一个Rails应用程序),您需要这样:
我贴这篇文章是因为我复制粘贴他的答案时做得不好,我不小心在我的路径上多了一个斜杠:
它的值为
/*
,因为它将其视为根路径。如果您将其放入FileUtils.rm_rf Dir.glob
,它将尝试递归删除文件系统中的所有内容(可能受您的权限限制)。new9mtju7#
铁皮人几乎得到了它的权利-但在情况下,目录不是空的使用
vulvrdjw8#
如果您只有文件或空目录,下面是另一个非常简洁的变体:
i7uq4tfw9#