2013-08-06 2 views
1

В настоящее время я получаю путь как \\documents\videos\form.mov, но мне нужно изменить путь к /documents/videos/form.mov. Я пробовал использовать разделитель пути, а также split. Но это не позволяет разбить путь, так как '\' является escape-символом.Convert windows path to Linux path

Пожалуйста, помогите мне в этом.

+3

Как вы «получаете путь»? Что вы пробовали (покажите свой код)? – Floris

+0

У меня нет опыта с рубином, но обычно вы можете избежать escape-символа, удвоив его («\\» будет соответствовать буквальному символу обратной косой черты). – 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 =" \\\\ документы \ videos \ form.mov " =>" \\\\ documents \ videos \ form.mov " 2.0 .0p0: 031> new_path = path.gsub/\\ + /, '/' => "/documents\videos\form.mov" ' –

+1

Ваша версия моего кода не работает, потому что вы используете двойные кавычки , Кавычки не «меняют путь». Выбор кавычек просто определяет, какие специальные последовательности транслируются, поэтому в двойных кавычках '\ n' означает новую строку, которая внутри одинарных кавычек означает rwo-символы' \ 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