有什么方法可以检查文件是否存在于ruby中而不会出现问题?

时间:2017-01-12 07:16:54

标签: ruby

使用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

3 个答案:

答案 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类。

相关问题