【发布时间】:2011-08-24 09:11:42
【问题描述】:
我想编写一个在 windows 和 linux 中运行的应用程序。但我有一个路径问题,因为 Windows 使用“\”而 Linux 使用“/”。我该如何解决这个问题。 谢谢
【问题讨论】:
我想编写一个在 windows 和 linux 中运行的应用程序。但我有一个路径问题,因为 Windows 使用“\”而 Linux 使用“/”。我该如何解决这个问题。 谢谢
【问题讨论】:
在 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"
【讨论】:
File.join,实际上所有路径都由/ 分隔,无论环境如何。这就是路径在 ruby 中的表示方式,即使在 Windows 的情况下,您也必须在初始化文件时使用 / 作为文件路径。
separator = rb_obj_freeze(rb_usascii_str_new2("/")); 这是大错特错...
【讨论】:
File.join 将使用 \ 或 / 作为分隔符。
File.join在Windows上也使用/。
只要 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。
使用Pathname 类生成路径,这些路径将在您的系统上正确:
a_path = Pathname.new("a_path_goes_here")
这样做的好处是允许您使用+ 运算符链接目录:
a_path + "another_path" + "and another"
然后调用a_path.to_s 将为您所在的系统生成正确的路径。
【讨论】:
File.join 即使在 Windows 机器上仍将使用/。 Pathname 将使用操作系统所说的任何内容。
是的,作为 Windows 用户,如果您需要将反斜杠复制到文件管理器的路径,则不断将这些反斜杠替换为斜杠,反之亦然,这很烦人,所以我像他的那样做。 如果你是在 Linux 或 Mac 上,它没有什么坏处,并且在 windows 中节省了很多麻烦。
path = 'I:\ebooks\dutch\_verdelen\Komma'.gsub(/\\/,'/')
Dir.glob("#{path}/**/*.epub").each do |file|
puts file
end
【讨论】: