Ruby:windows路径转换

时间:2012-06-07 11:35:07

标签: ruby regex windows

我经常在我的脚本中使用长路径,因为我在Windows上,我必须将这些长路径转换为带有斜杠的nix样式而不是反斜杠。没有什么困难但是很烦人,如果此后你复制那条路径去那个文件夹,因为在资源管理器中你必须再做相反的事情。

所以我创建了一个执行转换的函数,现在我可以使用我可以复制的windowspaths并保持Ruby满意。

问题:这里有更优雅的解决方案吗?我不喜欢第二个gsub在他开始时处理双\ \并且也想在最后处理\(目前不可能)。该函数应该能够处理网络unc(\ ..)和本地驱动路径(c:..)

class String 
  def path
    self.gsub('\\','/').gsub(/^\//,'//')
  end
end

path = '\\server\share\folder'.path

Dir.glob(path+'**/*') do |file|
  puts file
end

#=>
#//server/share/folder/file1.txt
#//server/share/folder/file2.txt

2 个答案:

答案 0 :(得分:1)

使用File.join的建议让我尝试了常规的分割和放大加入,现在我有这个版本,摆脱了丑陋的双gsub,现在它更长但可以处理结束斜杠。有人有更好的版本吗?

class String
  def to_path(end_slash=false)
    "#{'/' if self[0]=='\\'}#{self.split('\\').join('/')}#{'/' if end_slash}" 
  end 
end

puts '\\server\share\folder'.to_path(true) #//server/share/folder/
puts 'c:\folder'.to_path      #c:/folder

答案 1 :(得分:-1)

编写路径的可移植方式是使用Ruby的File#join方法。这将使用正确的路径分隔符创建独立于OS的路径。

对于UNC路径,此previous answer解决了自定义File#to_unc方法的创建问题:

def File.to_unc( path, server="localhost", share=nil )
  parts = path.split(File::SEPARATOR)
  parts.shift while parts.first.empty?
  if share
    parts.unshift share
  else
    # Assumes the drive will always be a single letter up front
    parts[0] = "#{parts[0][0,1]}$" 
  end
  parts.unshift server
  "\\\\#{parts.join('\\')}"
end

我自己没有尝试过,但这似乎是你正在寻找的结果。