使用 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)
尝试这个
\n\nFile.exist?(fname)\nFile.file?(fname)\nRun Code Online (Sandbox Code Playgroud)\n\n但有时,如果您需要检查存在性并在原子操作中打开文件,最好只是打开文件并通过挽救异常来处理丢失文件的情况。
\n\n为什么这是一个好主意?当您处理数据库和缓存层时,这主要适用于后端的基础设施代码。有时,如果在获取分支和使用内容\xe2\x80\x94之间删除或替换文件,您的代码不受影响可能是至关重要的当文件被删除时,句柄保持打开状态并且仍然可以使用!
\n\nbegin\n File.open(fname) { ... }\nrescue Errno::ENOENT => e \n ...\nend\nRun Code Online (Sandbox Code Playgroud)\n\nENOENT是“文件未找到”的 C 库错误代码,有关所有错误代码的完整列表,请参阅此处。Ruby 的大部分文件处理基本上只是底层 C 库的薄包装。正如您在浏览课程时可能已经注意到的那样File。
从我的头顶掉下来...
Pathname.exist?(NAME)
FileTest.exist?(NAME)
Pathname.file?(NAME)
FileTest.file?(NAME)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4693 次 |
| 最近记录: |