2011-08-24 6 views
13

WindowsとLinuxで動作するアプリケーションを作成したいと思います。私はこの問題を解決することができますが、Windowsは "\"とLinux use "/"を使用するため、パスの問題があります。 おかげRubyのスラッシュとバックスラッシュ

答えて

9

はFile.joinを見てみましょう:Rubyでhttp://www.ruby-doc.org/core/classes/File.html#M000031

+0

"join"メソッドがLinux用のようですTウィンドウ用の結合メソッドを使用するにはどうしたらいいですか? –

+0

あなたのプラットフォームに応じて、 'File.join'は\や/をセパレータとして使います。 – Wukerplank

+11

実際に 'File.join'はWindowsでも'/'を使います。 – dubek

17

を、LinuxまたはWindowsでのパスの間に違いはありません。環境にかかわらず、パスは/を使用する必要があります。したがって、Windowsで任意のパスを使用する場合は、\をすべて/に置き換えてください。 File#joinは、WindowsとLinuxの両方で動作します。たとえば、Windowsで:

Dir.pwd 
=> "C/Documents and Settings/Users/prince" 

File.open(Dir.pwd + "/Desktop/file.txt", "r") 
=> #<File...> 

File.open(File.join(Dir.pwd, "Desktop", "file.txt"), "r") 
=> #<File...> 

File.join(Dir.pwd, "Desktop", "file.txt") 
=> "C/Documents and Settings/Users/prince/Desktop/file.txt" 
+2

これは、外部コマンドを実行する場合にのみ機能します。 – Automatico

+0

...窓には何も意味を持たない//?/に変換される\\?\(パス> 260バイトに必要な)のような特別な接頭辞があります...だから、この機能は実際にはバグの犠牲者です – estani

+0

@estani私はそれが機能だとは言わなかった。私は 'File.join'と言って、実際には環境にかかわらずすべてのパスを'/'で区切っています。これはルビでパスがどのように表現されているかを示しています。ファイルを初期化するときにファイルパスにWindowsの場合でも '/'を使用する必要があります。 – rubyprince

7

は、あなたのシステムに正しいはずのパスを生成するPathnameクラスを使用します。

a_path = Pathname.new("a_path_goes_here") 

この利点は、それがでチェーンディレクトリにあなたをできるようにするということですa_path.to_sは、あなたがオンになっているシステムの正しいパスを生成します呼び出す

a_path + "another_path" + "and another" 

+演算子を使用。

+2

巨大なWeb開発フレームワークで動作している場合を除き、 "pathname"が必要なことを忘れないでください。 –

+0

これは、私が何かが見つからない限り、Windows上のRuby 2.0.0では機能しません: p = Pathname.new p = p + "apple" + "banana" puts p.to_s < "apple/banana" –

+0

代わりにFile.joinを使用すると、pathnameよりも簡単で迷惑にならず、うまくいきます。 – shevy

6

あなたは特に、コマンドラインまたはファイルのアップロードのようなもので、いくつかの他のプログラムが使用するパスを送るようにしたら限りRubyは仕事をしているように、パス名に/は、Windows

にokですブラウザでは、Windowsで実行しているときにスラッシュをバックスラッシュに変換する必要があります。

C:/projects/a_project/some_file.rb'.gsub('/', '\\')は魅力的です。 (これは二重バックスラッシュであると考えられています - このエディタは一重引用符でもエスケープとみなします)

Rubyのコントロールからパス名の文字列を送信する直前にこのような方法を使用します。

プログラムが実行されていることをプログラムが認識していることを確認して、いつ実行する必要があるかを判断する必要があります。一つの方法は、プログラムの実行の開始時に、この

::USING_WINDOWS = !!((RUBY_PLATFORM =~ /(win|w)(32|64)$/) || (RUBY_PLATFORM=~ /mswin|mingw/))

のようなものを定数を設定することです(私はこの作品を知っているが、私は二重の強打を理解していないので、私はそれを書いていません。.. 。)

+2

私は '!!'がそれをブール値に変換すると信じています。 Rubyでは、trueは通常、非nilまたはfalseでないオブジェクトとして返されます(あなたの場合はMatchオブジェクトを取得します)。 '!'はオブジェクトを 'false'に変換し、2番目の'! 'は' true'に変換します。 –

0

はい、ファイル管理者にコピーするためのパスが必要な場合は、バックスラッシュをスラッシュに置き換えておくことは迷惑です。 LinuxやMacでWindowsに迷惑をかけても問題ありません。

path = 'I:\ebooks\dutch\_verdelen\Komma'.gsub(/\\/,'/') 

Dir.glob("#{path}/**/*.epub").each do |file| 
    puts file 
end 
関連する問題