2012-06-07 103 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總是使用/。 –