1

私はFile Class以下のようなメソッドの有用性と混同しています:

 1. File::absolute_path
 2. File::realdirpath
 3. File::realpath
 4. File::expand_path

私が以下で試したこと:

irb(main):001:0> Dir.pwd
=> "C:/Users/Matt"
irb(main):002:0> Dir.chdir('D:\VB Script\excel_ie_wsh')
=> 0
irb(main):003:0> Dir.pwd
=> "D:/VB Script/excel_ie_wsh"
irb(main):005:0> File.realdirpath('\VB Script\excel_ie_wsh')
=> "/VB Script/excel_ie_wsh"
irb(main):006:0> File.realpath('\VB Script\excel_ie_wsh')
=> "/VB Script/excel_ie_wsh"
irb(main):007:0> File.absolute_path('\VB Script\excel_ie_wsh')
=> "D:/VB Script/excel_ie_wsh"
irb(main):008:0> File.realpath('readme.txt')
=> "D:/VB Script/excel_ie_wsh/readme.txt"
irb(main):009:0> File.realdirpath('readme.txt')
=> "D:/VB Script/excel_ie_wsh/readme.txt"
irb(main):012:0> File.absolute_path('readme.txt')
=> "D:/VB Script/excel_ie_wsh/readme.txt"
irb(main):013:0>

質問:

  1. なぜ、同じ出力File.realdirpathを生成しますか?File.realpath
  2. とどうFile.realpath違うのFile.absolute_path
  3. とどうabsolute_path(file_nam)違うのabsolute_path(file_name[, dir_string] )
  4. とどうrealdirpath(pathname)違うのrealdirpath(pathname [, dir_string])
4

2 に答える 2

4

File.realdirpath と File.realpath が同じ出力を生成するのはなぜですか?

ruby-doc によると、これら 2 つの方法の唯一の違いは、パス名の最後のコンポーネントが存在する必要があるかどうかです。asが例外をスローするrealdirpath場所は気にしません。realpath

たとえば、存在しないファイルのパスを取得する場合:

irb(main):001:0> File.realpath('nonexistent.file')
Errno::ENOENT: No such file or directory - H:/nonexistent.file
        from (irb):1:in `realpath'
        from (irb):1
        from C:/Ruby193/bin/irb:12:in `<main>'

irb(main):002:0> File.realdirpath('nonexistent.file')
=> "H:/nonexistent.file"

File.realpath と File.absolute_path の違いは?

私はこれをテストするために UNIX システムを使用していませんが、唯一の違いは、パスがいつチルダ (つまり ~) を開始するかということです。UNIX では、チルダはホーム ディレクトリを表します。2 つの方法の違いは、ホーム ディレクトリを展開するかどうかにあると思います。

Windows を使用している場合は問題ありません (つまり、ホーム ディレクトリのショートカットはありません)。

realdirpath(pathname) は realdirpath(pathname [, dir_string]) とどう違うのですか?

ruby-doc には、「dir_string が指定されている場合、現在のディレクトリではなく、相対パス名を解釈するためのベース ディレクトリとして使用されます」と記載されています。つまり、dir_string を指定して開始点をオーバーライドできます。

たとえば、次のように仮定します。

  1. H: ドライブのルートから irb を実行しています (つまり、これが現在のディレクトリです)。
  2. 「Folder」という名前のサブフォルダーがあります (つまり、H:\Folder)。

次に、違いを確認できます。

H:\>irb
irb(main):001:0> File.realdirpath('test.txt')
=> "H:/test.txt"

irb(main):002:0> File.realdirpath('test.txt', './Expense')
=> "H:/Expense/test.txt"

2 番目のステートメントは、dir_string で指定されたディレクトリを基準にしてファイルを見つけていることがわかります。

absolute_path(file_nam) は absolute_path(file_name[, dir_string] ) とどう違うのですか?

これは前の質問と同じです。

于 2013-01-29T17:56:40.260 に答える
2

これは質問への回答ではなく、Ruby、Perl、そしておそらく Python などの言語を Windows ボックスで使用する際に、正気を保つためのものです。

バックスラッシュを使用してパスを記述するのに時間を無駄にしないでください。代わりに、*nix タイプの OS に参加し、コード内でスラッシュを使用してください。これにより、デスクトップ環境からネットワーク/ホスティング環境へのファイルの移動が容易になります。これは、インターネットや企業の重要な役割は通常 *nix システムであるためです。

IO ドキュメントには次のように記載されています。

Ruby は、可能であれば、異なるオペレーティング システムの規則間でパス名を変換します。たとえば、Windows システムでは、ファイル名「/gumby/ruby/test.rb」は「\gumby\ruby\test.rb」として開かれます。Ruby 文字列で Windows スタイルのファイル名を指定するときは、必ずバックスラッシュをエスケープしてください。

"c:\\gumby\\ruby\\test.rb"

ここでの例では、Unix スタイルのスラッシュを使用します。File::SEPARATOR を使用して、プラットフォーム固有の区切り文字を取得できます。

于 2013-01-28T21:06:04.643 に答える