Избегайте двойной и одиночной обратной косой черты в строке - PullRequest
16 голосов
/ 05 мая 2010

Я пытаюсь получить доступ к сетевому пути в моем скрипте ruby ​​на платформе Windows в таком формате.

\\servername\some windows share\folder 1\folder2\

Теперь, если я попытаюсь использовать это как путь, он не будет работать. Одиночные обратные косые черты не экранированы должным образом для этого сценария.

path = "\\servername\some windows share\folder 1\folder2\"
d = Dir.new(path)

Я перепробовал все, что мог придумать, чтобы правильно избежать косых черт на пути. Однако я не могу избежать этой единственной обратной косой черты - из-за ее особого значения. Я пробовал одинарные кавычки, двойные кавычки, избегая обратной косой черты, используя альтернативные кавычки, такие как% Q {} или% q {}, используя преобразование ascii в char. Ничто не работает в том смысле, что я не делаю это правильно. :-) В настоящее время временное решение состоит в том, чтобы сопоставить сетевой диск N: \, указывающий на этот путь, и получить к нему доступ таким образом, но это не решение.

Кто-нибудь знает, как правильно избежать одиночных обратных слешей?

Спасибо

Ответы [ 2 ]

22 голосов
/ 05 мая 2010

Просто удвойте каждый обратный слеш, вот так:

"\\\\servername\\some windows share\\folder 1\\folder2\\"
13 голосов
/ 05 мая 2010

Попробуйте это

puts '\\\\servername\some windows share\folder 1\folder2\\'
#=> \\servername\some windows share\folder 1\folder2\

Пока вы используете одинарные кавычки для определения вашей строки (например, 'foo'), не нужно экранировать одиночную \. за исключением следующих двух случаев

  1. \\ работает на один \. Итак, \\\\ даст вам стартовый \\, который вам нужен.
  2. Трейлинг \ в конце вашего пути будет пытаться избежать закрывающей кавычки, поэтому вам также понадобится \\.

С другой стороны,

Вы можете определить элегантного помощника для себя. Вместо использования неуклюжих \ разделителей пути, вы можете использовать / в сочетании с методом, подобным этому:

def windows_path(foo)
  foo.gsub('/', '\\')
end

puts windows_path '//servername/some windows share/folder 1/folder2/'
#=> \\servername\some windows share\folder 1\folder2\

Сладкие!

...