Ruby:Windowspath转换

我经常在我的脚本中使用长path,因为我在Windows上,我必须将这些长path转换为nix样式,而不是反斜杠。 没有困难,但烦人,如果此后,您复制该path到该文件夹​​,因为在资源pipe理器中,你必须做相反的一次。

所以我做了一个function,做转换,现在我可以使用windowspaths,我可以复制,并保持ruby满意。

问:这里有更优雅的解决scheme吗? 我不喜欢第二个gsub在开始时处理双“\”,也想在最后处理一个“\”(目前不可能)。 该函数应该能够处理networkingunc(\ ..)和本地驱动器path(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 

建议使用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 

可写入路径的可移植方式是使用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 

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