【问题标题】:slash and backslash in RubyRuby 中的斜杠和反斜杠
【发布时间】:2011-08-24 09:11:42
【问题描述】:

我想编写一个在 windows 和 linux 中运行的应用程序。但我有一个路径问题,因为 Windows 使用“\”而 Linux 使用“/”。我该如何解决这个问题。 谢谢

【问题讨论】:

    标签: ruby path


    【解决方案1】:

    在 Ruby 中,Linux 或 Windows 中的路径没有区别。无论环境如何,路径都应使用/。因此,要在 Windows 中使用任何路径,请将所有 \ 替换为 /File#join 适用于 Windows 和 Linux。例如,在 Windows 中:

    Dir.pwd
    => "C/Documents and Settings/Users/prince"
    
    File.open(Dir.pwd + "/Desktop/file.txt", "r")
    => #<File...>
    
    File.open(File.join(Dir.pwd, "Desktop", "file.txt"), "r")
    => #<File...>
    
    File.join(Dir.pwd, "Desktop", "file.txt")
    => "C/Documents and Settings/Users/prince/Desktop/file.txt"
    

    【讨论】:

    • 哦,如果这仅在您想运行外部命令时有效。
    • ... 不正确,在 Windows 中有特殊前缀,例如 \\?\(路径 >260 字节需要),它们被转换为 //?/ 根本没有意义...所以该功能确实是一个错误问题
    • @estani 我没说这是一个功能。我说File.join,实际上所有路径都由/ 分隔,无论环境如何。这就是路径在 ruby​​ 中的表示方式,即使在 Windows 的情况下,您也必须在初始化文件时使用 / 作为文件路径。
    • @rubyprince 你是对的。尽管 join 使用了分隔符常量,但它被硬编码为 /... from file.c separator = rb_obj_freeze(rb_usascii_str_new2("/")); 这是大错特错...
    • 在 Windows 上,我必须将冒号添加到 'c' 路径:` "C:/Documents and Settings/Users/prince/Desktop/file.txt"`
    【解决方案2】:

    【讨论】:

    • 似乎 "join" 方法适用于 linux T 如何在 windows 中使用 join 方法?
    • 根据您的平台,File.join 将使用 \ 或 / 作为分隔符。
    • 其实File.join在Windows上也使用/
    【解决方案3】:

    只要 Ruby 完成这项工作,路径名中的 / 在 Windows 上就可以了

    一旦您必须发送路径供其他程序使用,尤其是在命令行中或在浏览器中上传文件之类的东西时,在 Windows 中运行时,您必须将斜杠转换为反斜杠。

    C:/projects/a_project/some_file.rb'.gsub('/', '\\') 很有魅力。 (这应该是一个双反斜杠 - 此编辑器即使在单引号中也将其视为转义。)

    在将路径名的字符串发送到 Ruby 的控制之外之前使用类似的东西。

    您必须确保您的程序知道它正在运行的操作系统,以便它可以决定何时需要。一种方法是在程序运行开始时设置一个常量,像这样

    ::USING_WINDOWS = !!((RUBY_PLATFORM =~ /(win|w)(32|64)$/) || (RUBY_PLATFORM=~ /mswin|mingw/))

    (我知道这行得通,但我没有写它,所以我不明白双重爆炸......)

    【讨论】:

    • 我相信 !! 会将其转换为布尔值。在 ruby​​ 中,true 通常作为非 nil 或非 false 对象返回(在你的情况下你会得到一个 Match 对象)。 ! 将对象转换为false,第二个! 将其转换为true
    【解决方案4】:

    使用Pathname 类生成路径,这些路径将在您的系统上正确:

    a_path = Pathname.new("a_path_goes_here")
    

    这样做的好处是允许您使用+ 运算符链接目录:

    a_path + "another_path" + "and another"
    

    然后调用a_path.to_s 将为您所在的系统生成正确的路径。

    【讨论】:

    • 别忘了 require "pathname" 除非你在一个庞大的 Web 开发框架上运行。
    • 这不适用于 Windows 上的 Ruby 2.0.0,除非我遗漏了一些东西: p = Pathname.new("") p = p + "apple" + "banana" puts p。 to_s
    • 使用 File.join 代替,它比路径名更简单且不那么烦人 - 而且它会工作得很好。
    • @shevy [需要引用]。为什么它“不那么烦人”?
    • 我还认为File.join 即使在 Windows 机器上仍将使用/Pathname 将使用操作系统所说的任何内容。
    【解决方案5】:

    是的,作为 Windows 用户,如果您需要将反斜杠复制到文件管理器的路径,则不断将这些反斜杠替换为斜杠,反之亦然,这很烦人,所以我像他的那样做。 如果你是在 Linux 或 Mac 上,它没有什么坏处,并且在 windows 中节省了很多麻烦。

    path = 'I:\ebooks\dutch\_verdelen\Komma'.gsub(/\\/,'/')
    
    Dir.glob("#{path}/**/*.epub").each do |file|
        puts file
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-14
      • 1970-01-01
      • 2017-03-29
      • 2012-02-10
      • 2013-11-14
      相关资源
      最近更新 更多