使用Ruby的核心类/模块检查文件是否存在的所有方法是什么?没有炮轰?
也会理解为什么选择一种方法而不是另一种方法是有道理的。例如:使用Dir['**/*'].grep(/foo/)
是我发现使用正则表达式匹配路径的最短路径。
但是,我认为Pathname.new('.').find.any? { |pn| pn.fnmatch? "*foo*" }
是一个不错的选择,因为Pathname是一个跨平台的解决方案,通常似乎“正常工作”。
我错过了任何解决方案/课程/模块吗?此外,我还会欣赏涉及速度/效率分析的答案。
require 'minitest/autorun'
require 'pathname'
class TestTouch < Minitest::Test
include FileUtils
attr_reader :foo
def setup
@foo = Pathname.new('foo')
foo.delete if foo.exist?
end
def teardown
foo.delete if foo.exist?
end
def test_touch
touch foo
cwd = Pathname.new('.')
assert cwd.find.to_a.map(&:to_s).grep(/foo/).any?
assert cwd.find.any? { |pn| pn.fnmatch? "*foo*" }
assert cwd.join('foo').exist?
assert Dir['**/*'].grep(/foo/)
assert Dir.glob('**/*').grep(/foo/)
assert !Dir.glob('foo').empty?
assert File.exist?('foo')
end
end
答案 0 :(得分:1)
怎么样
File.exists?(NAME)
?请注意,如果NAME是例如目录,这也会返回true。
答案 1 :(得分:1)
脱离我的头顶......
Pathname.exist?(NAME)
FileTest.exist?(NAME)
Pathname.file?(NAME)
FileTest.file?(NAME)
答案 2 :(得分:1)
试试这个
route2
有时候,如果您需要检查存在并在原子操作中打开文件,最好只需打开文件并通过挽救异常来处理丢失文件的情况。
为什么这是个好主意?当您处理数据库和缓存层时,这主要适用于后端的基础结构代码。有时,如果在删除文件或删除文件之间取代文件并使用内容时,您的代码不会受到影响至关重要 - 删除文件时句柄仍保持打开状态仍然可以使用!
File.exist?(fname)
File.file?(fname)
begin
File.open(fname) { ... }
rescue Errno::ENOENT => e
...
end
是&#34;找不到文件的C库错误代码&#34;有关所有错误代码的完整列表,请参阅here。 Ruby的大多数文件处理基本上只是底层C库的一个薄包装。您可能已经注意到浏览ENOENT
类。