ruby 中检查文件是否存在的所有方法都有哪些,而不用 shell 删除?

mbi*_*ras 5 ruby

使用 Ruby 的核心类/模块检查文件是否存在而不需要 shell 的所有方法有哪些?

还会理解为什么选择一种方法而不是另一种方法更有意义的原因。例如:使用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
Run Code Online (Sandbox Code Playgroud)

aku*_*uhn 8

尝试这个

\n\n
File.exist?(fname)\nFile.file?(fname)\n
Run Code Online (Sandbox Code Playgroud)\n\n

但有时,如果您需要检查存在性并在原子操作中打开文件,最好只是打开文件并通过挽救异常来处理丢失文件的情况。

\n\n

为什么这是一个好主意?当您处理数据库和缓存层时,这主要适用于后端的基础设施代码。有时,如果在获取分支和使用内容\xe2\x80\x94之间删除或替换文件,您的代码不受影响可能是至关重要的当文件被删除时,句柄保持打开状态并且仍然可以使用!

\n\n
begin\n  File.open(fname) { ... }\nrescue Errno::ENOENT => e  \n  ...\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

ENOENT是“文件未找到”的 C 库错误代码,有关所有错误代码的完整列表,请参阅此处。Ruby 的大部分文件处理基本上只是底层 C 库的薄包装。正如您在浏览课程时可能已经注意到的那样File

\n


Sch*_*ern 1

从我的头顶掉下来...

Pathname.exist?(NAME)
FileTest.exist?(NAME)
Pathname.file?(NAME)
FileTest.file?(NAME)
Run Code Online (Sandbox Code Playgroud)