2013-08-06 206 views
1

目前我得到的路徑\\documents\videos\form.mov,但需要在路徑更改爲/documents/videos/form.mov。我曾嘗試使用路徑分隔符以及split。但它不允許將路徑拆分爲'\'是一個轉義字符。轉換Windows路徑到Linux路徑

請任何人都可以在這幫助我。

+3

你是如何 「獲取路徑」?你嘗試過什麼(顯示你的代碼)? – Floris

+0

我沒有使用紅寶石的經驗,但通常你可以通過加倍來逃避轉義字符(「\\」將匹配字面反斜槓字符)。 – Michelle

+1

「但它不允許將路徑拆分爲'\'是轉義字符。」 那麼,這部分是一個簡單的修復。只需使用兩個反斜槓(第一個反轉第二個)。 – Ajedi32

回答

2
path = '\\\\documents\videos\form.mov' 

new_path = path.gsub /\\+/, '/' 

puts path, new_path 

輸出

\\documents\videos\form.mov 
/documents/videos/form.mov 

這裏是一個irb會議

E:\Ruby\source>irb --simple-prompt 
>> path = '\\\\documents\videos\form.mov' 
=> "\\\\documents\\videos\\form.mov" 
>> new_path = path.gsub /\\+/, '/' 
=> "/documents/videos/form.mov" 
>> 
+0

在這裏你已經在單引號中使用路徑...所以它會改變路徑爲'\ \\\ documents \\ videos \ form.mov'因此它很容易轉換,但在我的情況....我得到的路徑從用戶...即用戶正在進入路徑,所以他不會進入路徑單引號。當我嘗試你的路徑解決方案時,它給我的輸出爲 'path =「\\\\ documents \ videos \ form.mov」 =>「\\\\ documents \ videos \ form.mov」 2.0 .0p0:031> new_path = path.gsub/\\ +/'/' => 「/documents\videos\form.mov」 ' –

+1

你的我的代碼版本沒有工作監守你使用雙引號。引號不會「改變路徑」。引號的選擇簡單地決定了什麼特殊的序列被翻譯,所以在雙引號中'\ n'意味着一個換行符,它在單引號內意味着兩個字符'\ n'。如果你的用戶輸入'\\ documents \ videos \ form.mov'作爲提示的輸入,那麼這正是你的字符串所包含的內容(最後有一個換行符,你需要''chomp''''''''''''''''''''''''來描述更多你的程序,如果你仍然卡住 – Borodin

+0

Thanks.Resolved用相同的代碼的問題。 –

0

現有的答案沒有達到我的預期的副本,所以我不得不推出自己的。這裏是模塊和它的單元測試。

module ConvertWindowsPath 
    def convert_windows_path windows_path 
    manipulated_windows_path = windows_path.clone 
    unix_path = "" 
    if windows_path.start_with? "\\\\" #it's on some network thing 
     unix_path = "//" 
     manipulated_windows_path = manipulated_windows_path[2..-1] 
    elsif manipulated_windows_path.start_with? "\\" 
     unix_path = "/" 
    end 
    unix_path += manipulated_windows_path.split("\\").join("/") 
    unix_path += "/" if manipulated_windows_path.end_with?("\\") 
    unix_path 
    end 
end 

require 'test/unit' 

class ConvertWindowsPathTest < Test::Unit::TestCase 
    include ConvertWindowsPath 
    def setup 
    @expectations = { 
     "C:\\" => "C:/", 
     "\\\\vmware-host\\Shared Folders\\Foo\\bar-baz" => "//vmware-host/Shared Folders/Foo/bar-baz", 
     "D:\\Users\\ruby\\Desktop\\foo.txt" => "D:/Users/ruby/Desktop/foo.txt", 
     "z:\\foo\\bar\\" => "z:/foo/bar/" 
    } 
    end 
    def test_expectations 
    @expectations.each do |windows_path, expected_unix_path| 
     assert_equal expected_unix_path, convert_windows_path(windows_path) 
    end 
    end 
end