2

私はスクリプトで長いパスをよく使用しますが、Windows を使用しているため、バックスラッシュの代わりにスラッシュを使用して、これらの長いパスを nix スタイルに変換する必要があります。エクスプローラーでは反対のことをもう一度行う必要があるため、その後そのパスをコピーしてそのフォルダーに移動すると、面倒なことは何もありません。

そこで、変換を行う関数を作成しました。これで、コピーして Ruby を満足させることができる windowspaths を使用できるようになりました。

質問: ここでよりエレガントなソリューションはありますか? 2 番目の 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メソッドを使用することです。これにより、正しいパスセパレーターを使用して、OS に依存しないパスが作成されます。

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 に答える