2011-08-24 272 views
13

我想寫一個在windows和linux下工作的應用程序。但我有一個路徑問題,因爲Windows使用「\」和Linux使用「/」。我可以解決這個問題。 感謝Ruby中的斜槓和反斜槓

回答

17

在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" 
+2

哦,如果這隻在你想運行外部命令時才起作用。 – Automatico

+0

...不正確,在窗口中有特殊的前綴,比如\\?\(路徑需要> 260bytes),它被轉換爲//?/根本沒有任何意義......所以這個特性確實是一個bug代碼 – estani

+0

@estani我沒有說這是一個功能。我說'File.join'事實上所有路徑都由'/'分隔,無論環境如何。這就是如何在ruby中表示路徑,並且在初始化文件時,即使在Windows的情況下也需要使用'/'作爲文件路徑。 – rubyprince

7

使用Pathname類來生成,然後將是正確的您的系統上的路徑:

a_path = Pathname.new("a_path_goes_here") 

這樣做的好處是,它可以讓你鏈目錄由使用+操作:

a_path + "another_path" + "and another" 

調用然後a_path.to_s會爲你是在系統的正確路徑。

+2

不要忘記需要「路徑名」,除非你運行在一個巨大的web開發框架上。 –

+0

這不適用於Windows 2.0上的Ruby 2.0.0,除非我丟失了一些東西: p = Pathname.new(「」) p = p +「apple」+「banana」 puts p.to_s < - 「apple/banana」 –

+0

改爲使用File.join,它比路徑名更簡單,也更少煩人 - 它會工作得很好。 – shevy

6

只要紅寶石做的工作,/路徑名是在Windows

一次OK,你必須發送路徑一些其他程序使用,特別是在命令行或類似文件上傳的東西在瀏覽器中,您必須在Windows中運行時將斜槓轉換爲反斜槓。

C:/projects/a_project/some_file.rb'.gsub('/', '\\')作品魅力。 (這應該是一個雙反斜槓 - 這個編輯器甚至在單引號中認爲它是一種逃避)。

在將路徑名字符串發送出Ruby控件之前,使用類似的方法。

您將必須確保您的程序知道它正在運行的操作系統,以便它可以決定何時需要此操作系統。一種方法是在程序運行開始時設定一定的,像這樣

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

(我知道這工作,但我沒寫,所以我不明白的雙重爆炸.. )

+2

我相信'!!'將它轉換爲布爾值。在ruby中,true通常作爲非零或非錯誤對象返回(您會在您的案例中獲得一個Match對象)。 '!'將對象轉換爲'false',第二個'!'將它轉換爲'true'。 –

0

是的,它很煩人,因爲windows用戶不斷將這些反斜槓替換爲斜槓,反之亦然,如果您需要將路徑複製到您的文件管理器,那麼我就像他一樣。 如果你在Linux或Mac上,它並沒有什麼壞處,並且可以在Windows中節省大量的麻煩。

path = 'I:\ebooks\dutch\_verdelen\Komma'.gsub(/\\/,'/') 

Dir.glob("#{path}/**/*.epub").each do |file| 
    puts file 
end