2

我经常在我的脚本中使用长路径,因为我在 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
4

2 回答 2

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
于 2012-06-07T12:33:12.260 回答
-1

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

对于 UNC 路径,这个先前的答案解决了自定义 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

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

于 2012-06-07T11:54:26.200 回答