2012-06-07 73 views
1

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

所以我做了一个功能,做转换,现在我可以使用windowspaths,我可以复制,并保持红宝石sattisfied。

问题:这里有更优雅的解决方案吗?我不喜欢第二个gsub在开始时处理双“\”,并且还想在最后处理“\”(目前不可能)。该功能应该能够处理网络UNC的(\ ..)和本地drivepaths(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 
+0

我想看看路径名(http://www.ruby-doc.org/stdlib-1.9.3/libdoc/pathname/rdoc/Pathname.html),或至少文件#加入(HTTP: //www.ruby-doc.org/core-1.9.3/File.html#method-c-join)而不是手动执行此操作。 –

+0

thnx迈克尔,路径名似乎很有趣,但我不明白它是如何帮助我做到这一点,你可以给一个答案的例子吗?如果我使用File.join我比以前更远离家,那肯定不会在exeplorer中复制 – peter

+0

http://stackoverflow.com/questions/4862192/convert-windows-path-to-unc-in-红宝石。但是,另一个问题更窄。 –

回答

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 
+0

确保转换路径用'而不是'括起来 – peter

-1

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

对于UNC路径,这previous answer地址创建一个自定义文件#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 

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

+0

这是我所要求的相反,我需要开始UNC路径或本地路径,我可以复制和使用在资源管理器中,并被转换为Ruby中的可用路径 – peter

+0

在所有平台上,File.join总是使用/。 –