URI::file

Hippo2000 (2000/7/28)

URI::fileモジュールなのです。

作者はGisle Aasさんです。メールで許可をいただきました。


目次


名前

URI::file - ローカル・ファイル名に対応するURI


概要

 use URI::file;
 $u1 = URI->new("file:/foo/bar";);
 $u2 = URI->new("foo/bar", "file");
 $u3 = URI::file->new($path);
 $u4 = URI::file->new("c:\\windows\\", "win32");
 
 $u1->file;
 $u1->file("mac");

説明

URI::fileクラスはfileURIスキームに所属するURIオブジェクトをサポートします。このスキームはさまざまなコンピュータシステム上で見つかった従来のファイル名を、URI名前空間に対応づけることを可能にします。fileスキームの古い仕様はRFC1738にあります。いくつかのより古い背景情報はRFC1630にもあります。私が知る限りより新しい仕様はありません。

URI文字列からfileURIオブジェクトを単純に組み立てたいのであれば、通常のURIコンストラクタを使ってください。さまざまなシステムによって使われる実際のファイル名からileURIオブジェクトを組み立てたいならば、以下のURI::fileコンスタラクタの1つを使ってください。

$u = URI::file->new( $filename, [$os] )
ファイル名をfile:URI名前空間に対応づけ、URIオブジェクトを作成し、それを返します。$filenameは指定されたオペレーティング・システム($os)に所属するものとして解釈されます。(オペレーティングシステムの)デフォルトは$^O変数の値になります。$filenameは絶対でも相対でも指定することができ、$osのためのURIオブジェクトの対応するタイプが返されます。
$u = URI::file->new_abs( $filename, [$os] )
URI::file->newと同じ。ただし返されるURIは絶対ファイル名であることを保証します。$filename引数であれば、名前は現在のディレクトリからの相対として解決されます。つまりこのコンストラクタは以下のものと実質的に同じです:
  URI::file->new($filename)->abs(URI::file->cwd);
$u = URI::file->cwd
現在の作業ディレクトリを表すfileURIを返します。Cwdをご覧ください。

以下のメソッドはfileURIのためにサポートされています。(URIで記述されている共通と汎用メソッドに加えて)

$u->file( [$os] )
このメソッドはファイル名を返します。URI名前空間から指定されたオペレーティング・システムのファイル名空間に対応づけます。

指定されたファイルシステムでは表現することができなければ、undefを返すかもしれません。

$u->dir( [$os] )
システムによってはディレクトリ名にプレーンなファイルとは違う形式を使うものもあります。ディレクトリに使いたい名前が分かっていれば、このメソッドを使ってください。

URI::fileモジュールは汎用のファイル名を現在のシステムにあった名前に対応づけるために使うことができます。そのような場合、File::Specモジュールの代わりとして動くことができます。例えば以下のコードはUnix形式のファイル名 Foo/Bar.pmをローカル・システムにあった名前に変換します:

  $file = URI::file->new("Foo/Bar.pm", "unix")->file;
  die "Can't map filename Foo/Bar.pm for $^O" unless defined $file;
  open(FILE, $file) || die "Can't open '$file': $!";
  # do something with FILE

マッピングの注意

今日のほとんどのコンピュータシステムは階層的に組織されたファイルシステムを持っています。これらのシステムから汎用URI書式で使われる対応づけは、(RFC2396で定義されている)URIのための汎用アルゴリズムを使って解決されるとき、そうするべきであるように振る舞う相対ファイルURIと一緒に作業することを可能にします。

ファイル名から汎用URI書式への対応づけはパス区切り文字を"/"に対応づけること、ファイル名のパス・セグメントにあらわれる予約れた文字のすべてをエンコーディングすることを含みます。"."や".."が入っているパス・セグメントが汎用URIに指定されているものとは違う意味を持っていれば、これらもエンコードされなければなりません。

ファイルシステムがデバイス、ボリュームまたはドライブ指定を名前空間のルートとして持っていれば、汎用URI書式のauthorityフィールドへそれらが対応づけることを意味します。相対URIは、これにより"上に"解決されないことはないこと、つまり一般的に相対ファイル名はそれらのシステムで機能することを保証します。

authorityフィ−ルドの一般的な他の使い方は、このファイル名が適正であるホストをエンコードすることです。ホスト名"localhost"は特別で、一般的にauthorityフィールドがないか、空であるのと同じ意味を持ちます。この使い方はデバイスの指定として使うこととぶつかりますが、デバイス名がプレーンなホスト名では正しくない文字を持っていることにより解決されることが多くあります。

ファイル名からURIへのマッピングは通常1対1ではありません。通常たくさんのURIが同じファイル名に対応づけられます。例えば、"localhost"のauthorityはauthorityがなかったり、空だったりするURIと同じように対応づけられます。

例1:Macは":"を区切り文字として使いますが、一般的なURIとは同じ方法ではありません。":foo"は相対名です。"foo:bar"は絶対名です。またパス・セグメントには"/"や"."、".."を入れることができます。それは以下のように対応づけられます。

  Mac                   URI
  ----------            -------------------
  :foo:bar     <==>     foo/bar
  :            <==>     ./
  ::foo:bar    <==>     ../foo/bar
  :::          <==>     ../../
  foo:bar      <==>     file:/foo/bar
  foo:bar:     <==>     file:/foo/bar/
  ..           <==>     %2E%2E
  <undef>      <==      /
  foo/         <==      file:/foo%2F
  ./foo.txt    <==      file:/.%2Ffoo.txt
  
注意:もし相対URLが欲しければ、パスは:から始めなければ*いけません*。
[^:](:以外)から始まるパスは絶対として扱われます。

例2:Unixファイル・システムはURIと同じパス区切り文字を使っていて、1つのルートを持ち、"."と".."のセグメントが同じ意味を持つので、対付けが簡単です。文字"\0"や"/"をパス・セグメントの一部として持っているURIは正しいUnixファイル名にすることはできません。

  Unix                  URI
  ----------            ------------------
  foo/bar      <==>     foo/bar
  /foo/bar     <==>     file:/foo/bar
  /foo/bar     <==      file://localhost/foo/bar
  file:         ==>     ./file:
  <undef>      <==      file:/fo%00/bar
  /            <==>     file:/

参考資料

URI, File::Spec, perlport


著作権(COPYRIGHT)

Copyright 1995-1998 Gisle Aas.

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


ホーム Perlの小技  URI

ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。