给定一条路径,如何确定它在Ruby中是否为绝对/相对路径?

给定一条路径,如何确定它在Ruby中是否为绝对/相对路径?,ruby,cross-platform,Ruby,Cross Platform,我正在编写一个rake构建脚本,它将跨平台(macosx、Linux、Windows)工作。生成脚本将由用户使用 我希望脚本的逻辑如下所示: 如果路径被确定为相对路径,则通过使output\u path=FOO\u HOME+user\u provided\u relative\u path使其成为绝对路径 如果路径被确定为绝对路径,则按原样进行 我当前正在使用路径名。新建(位置)。绝对值?但它在windows上无法正常工作 您对此有何建议?您正在寻找的方法是 基本上,您可以这样做: absol

我正在编写一个rake构建脚本,它将跨平台(macosx、Linux、Windows)工作。生成脚本将由用户使用

我希望脚本的逻辑如下所示:

  • 如果路径被确定为相对路径,则通过使output\u path=FOO\u HOME+user\u provided\u relative\u path使其成为绝对路径
  • 如果路径被确定为绝对路径,则按原样进行
  • 我当前正在使用路径名。新建(位置)。绝对值?但它在windows上无法正常工作


    您对此有何建议?

    您正在寻找的方法是

    基本上,您可以这样做:

    absolute_path = Pathname.new(path).realpath
    

    注意:路径名模块指出,在没有类似unix的路径名的机器上,使用是实验性的。所以它依赖于实现。看起来JRuby应该可以在Windows上运行。

    Pathname
    可以为您完成所有这些

    require "pathname"
    home= Pathname.new("/home/foo")
    
    home + Pathname.new("/bin") # => #<Pathname:/bin>
    home + Pathname.new("documents") # => #<Pathname:/home/foo/documents>
    
    需要“路径名”
    home=Pathname.new(“/home/foo”)
    主页+路径名。新建(“/bin”)#=>#
    主页+路径名。新建(“文档”)#=>#
    

    不过,我对windows上的这一点不太清楚。

    您也可以使用
    文件。如果相对目录与当前工作目录相对,请展开\u path

    我在Linux和windows上进行了检查,没有任何问题

    假设
    FOO_HOME
    是工作目录,则代码为:

    output_path = File.expand_path user_supplied_relative_path
    

    有一个内置函数,可涵盖这两种情况,并完全满足您的需要:

    output_path = File.absolute_path(user_supplied_path, FOO_HOME)
    

    诀窍在于提供第二个论点。当(且仅当)第一个参数是相对路径时,它作为基本目录服务。

    Pathname\realpath
    假设您的相对路径是相对于当前工作目录的,而当前工作目录可能不是用户的主目录。您问题的标题有点误导。它实际上与您在文本中的要求不符。相关:
    文件。expand\u path
    执行以下操作:1。如果参数是一条相对路径,则从中找出一条绝对路径;2.展开
    ~
    ~username
    。这意味着,
    File.expand\u path
    执行的操作比OP要求的稍多。改用
    File.absolute\u path
    。您不必假定
    FOO\u HOME
    是工作目录
    File.chdir
    带有一个块可以确保在不永久修改工作目录的情况下:
    File.chdir(FOO\u HOME){File.absolute\u path user\u provided\u relative\u path}
    。更简单的方法是提供
    FOO_HOME
    作为调用的第二个参数。
    File.expand_path
    File.absolute_path
    接受它。要求“pathname”是ruby标准库的一部分
    output_path = File.absolute_path(user_supplied_path, FOO_HOME)