ファイルやその他のリソースへのアクセス

概要

リソースは、ファイル、Web ページ、またはアプリケーションがデータをやりとりできるものを表す抽象的な用語です。Curl® 実行環境 (RTE) を使用すると、可能な限り同じ方法で異なるリソースにアクセスできるため、データの取得と保存よりもプログラムでデータを処理する方法に重点を置くことができます。
ランタイムによりリソースとの間でデータの読み取りおよび書き込みができます。さらに、データ リソースを操作して、ファイル システム内にあるファイルの削除またはファイル名の変更を行うことができます。
リソースとの間で読み込み、書き込み、または操作を行う前に、そのリソースを識別する必要があります。次のセクションでは、リソースの識別方法について説明します。続くセクションでは、識別したリソースとの対話方法について説明します。
Curl API では、データ ファイルおよびデータベースのような、外部のデータソースを取り扱うことも可能です。 「外部ソースのデータの管理 」を参照してください。

URL によるリソースの識別

要約:
  • Universal Resource Identifier (URI) を使用してリソースを識別します。
  • Curl RTE は、URI の特有タイプの1つである URL を使用します。
  • URL を使用することにより、リモート データへのアクセスが容易になります。
Universal Resource Identifiers (URI) を使用して、ファイル システム内または Web サーバー上のファイルのようなリソースに名前を付けることができます。Curl RTE は URI の特有タイプの1つの Universal Resource Locator (URL) を使用します。Web ブラウザで表示する Web ページを識別するために URL が使用されているので、おそらく URL はすでにご存知でしょう。
URL の例を次に示します。
ランタイムは URL を使用してリソースにアクセスするため、ローカルのファイル システムにあるファイルにアクセスするのと同じくらい簡単にリモート サーバーにあるデータにアクセスできます。

URL の構造

URL は次の最大 4 つの部分で構成されます (左から右へ向かう順で表示)。

ランタイムでサポートされる標準スキーム

ランタイムでサポートされる標準スキームについて説明します。
ランタイムで識別されないスキームは Url クラスに格納することができます (次を参照)。ただし、サポートされていないスキームを使用する URL を操作すると、ほとんどの場合例外がスローされます。

curl :スキーム

上記の標準スキームの他に、ランタイムでは curl: スキームを介して Curl 言語特有のリソースにアクセスすることができます。curl: スキーム内で、トップレベル ディレクトリはアクセス中のリソースのタイプを判別します。ディレクトリである curl://string を使用すると、ファイルから読み取っているかのように文字列をストリームに変換できる文字列ファイルを作成できます。詳細については、「文字列ファイル」セクションを参照してください。
curl://offline/curl://root/curl://http-root/、そして curl://local-data のディレクトリは すべて随時接続コンピューティングで使用されます。詳細については 「随時接続コンピューティング」 を参照してください。curl://edit/ スキームで、ソース エディタをプログラムによって呼び出すことができます。
curl://source/curl://install/ のような他のディレクトリは Curl の社内限定使用のために留保されています。 ユーザーは特別な指示がない限り使用しないでください。

URL の使用

要約:
  • Url クラスは URL を表示します。
  • ローカル ファイルにアクセスするため、標準のファイル ダイアログから取得した PrivilegedUrl を使用します。
  • Url を使用すると、それらが表示している URL を操作することができます。
Url クラスは Curl 言語で URL を表します。ファイルへのアクセスが必要な Curl RTE 内のほとんどのメソッドは、Url オブジェクトを使用してファイルを識別できる必要があります。このクラスは、Url オブジェクトが表示する URL の特定部分を抽出することもできます。
これらのクラスのインスタンス作成については次のセクションで説明します。

セキュリティとファイル アクセス

ユーザーを保護するため、Curl RTE は (特別な特権モードで実行されている場合を除き) アプレットの機能に制限を設けています。Curl RTE のセキュリティ機能の概要については、「セキュリティ」の章を参照してください。
Web サイト上のファイルへのアクセスと、ローカルでのファイルへのアクセスの重要な違いの 1 つは、ランタイムがアクセスの各タイプに設定するセキュリティ制限の違いです。

Web サイト リソースの Url の作成

アプレットは Web サイトにアクセスしてデータ ファイル、イメージ、またはその他のリソースを取得することがよくあります。そうしたリソースを表す Url オブジェクトを作成する最も簡単な方法は、url プリミティブを使用することです。このプリミティブはリソースの URL を含む文字列を取り、Url オブジェクトを返します。以下は、Web ページ を表示する Url オブジェクトを作成する例です。
{let myurl:Url = {url "http://www.example.com/index.html"}}
Web サイト上のファイルを表す Url オブジェクトを持つことは、ファイルが存在すること、またはアプレットがそのファイルにアクセスできることを意味するものではありません。ランタイムは、アプレットがリソースとの間でデータ ストリームを開くなどの方法でリソースにアクセスしようとすると、アプレットがファイルにアクセスできるかどうかを判断します。アプレットがファイルにアクセスできない場合の原因として、URL で指定された Web サイトが存在しないか利用できない、ファイルが存在しない、またはファイルにアクセスする権限がアプレットに無いとランタイムが判断した、などが挙げられます。

Url をメソッドおよびプロシージャに渡す

ファイルの識別が必要なメソッドおよびプロシージャの多くは Url を引数として受け入れます。そのため、リソースに直接アクセスしたくない場合でも、Url オブジェクトをインスタンス化してこれらのメソッドまたはプロシージャの 1 つに渡す必要があります。
たとえば、image テキスト フォーマットの source パラメータは、Url を取得して表示するイメージ ファイルを指定します。オブジェクトを個別にインスタンス化して Url に渡す必要はありません。image の代わりに、通常は url 式を次の imageコールに組み込むだけです。
{image source={url "http://www.example.com/imgs/logo.gif"}}

相対 URL

スキームを含むパス全体を詳細に記述した URL (http://www.example.com/imgs/logo.gif など) は絶対です。リソースの場所を特定するのに必要な情報のすべてを提供します。リソースの完全な URL を常に渡すのは入力の必要量を増加させるだけでなく、ドキュメントやプログラムの移植性を低下させることにもなります。Web サイト上でのリソースの場所を変更する場合 (いくつかのファイルを新しいディレクトリに移動する場合など)、ソース ファイル全体を調べてすべての URL を変更する必要があります。
代わりに、url 式を相対パスに指定することができます。リソースの場所は Web サイト上でアプレットのソース ファイルとの相対関係で指定されます。相対 URL は次に示す相対パスの標準表記を使用します。
表記説明
..現在のディレクトリの親ディレクトリを参照します。たとえば、相対パス ../somedir/somefile.txt は親ディレクトリへ順に移動し、somedir サブディレクトリへ移動してファイル somefile.txt の場所を特定しするようランタイムに指示します。
.現在のディレクトリを参照します。相対パスの ./somefile.txtsomefile.txt は同じものです。
/相対パスの先頭にあるパス セパレータは、相対パスがファイル システムのルートから開始していることを意味します。
相対パスの一般的な使い方の 1 つは、記述されているソース ファイルと同じディレクトリ内でファイルを指定することです。ファイルは同じディレクトリ内にあるので、相対パスはファイルの名前だけで構成されます。

例: 相対パスの使用
{image source={url "../../default/images/generic.gif"}}

絶対 URL の確認

URL を含む String が絶対であることを確認したい場合、abs-url? プロシージャを使用してテストできます。URL が絶対のように見える場合、このプロシージャは true を返します。
セキュリティ上の理由から、相対 URL ではなく絶対 URL を強制的に使用する場合があります。この場合、url の代わりに abs-url を使用して StringUrl に変換します。絶対 URL が与えられているときは、abs-urlurl と全く同じ働きをします。ただし、String が相対 URL を含む場合、abs-urlError をスローします。
String が絶対 URL を含んでいることが明らかな場合 (たとえば、URL がページにハードコーディングされている場合)、url ではなく abs-url を使用して Url に変換します。この方がより能率的だからです。

ローカル ファイルの Url オブジェクトの作成

ユーザーはアプレットがローカル ファイル システムのファイルにアクセスできるようにするためアプレットにアクセス権を与える必要があります。そのため、ローカル ファイルの Url のインスタンス化は Web サイト上のファイルの場合とは異なります。アプレットは choose-file , choose-multiple-files またはchoose-locationを呼び出して、アクセスするファイルを選択するようユーザーに要求する必要があります。これらのプロシージャは、ユーザーにファイル (choose-multiple-files の場合は複数ファイル) を選択させるダイアログを開きます。これらのプロシージャを呼び出すときは、アプレットはファイルへのアクセスの種類 (読み取り専用、読み取りおよび書き込み、または新規ファイル作成) を宣言します。標準ファイル ダイアログの使い方の説明については、「ファイル ダイアログの作成」を参照してください。
次の例は choose-file プロシージャを呼び出してユーザーにファイルを選択させる方法を示しています。「Url についての情報の取得」で説明されている Url.name アクセッサを使用して、選択したファイルの URL を表示します。

例: choose-file を呼び出してローカル ファイルUrlオブジェクトを取得
{let output-area:TextDisplay = {TextDisplay width=3in}}

{VBox
    halign="right",
    output-area,
    {CommandButton
        label="Choose File",
        {on Action do
            {let file-url:#Url =
                {choose-file
                    style=FileDialogStyle.edit,
                    title="Select a File to Edit"
                }
            }
            {if-non-null file-url then
                || User selected a file Use it somehow.
                set output-area.value = file-url.name
            }
        }
    }
}
標準のファイル選択ダイアログは、ユーザーがファイルを選択すると PrivilegedUrl と呼ばれる Url のサブクラスを返します (ユーザーがファイル ダイアログをキャンセルした場合は null を 返します)。アプレットは標準のファイル選択ダイアログを介して行う以外に PrivilegedUrl を取得する方法がないので、Curl ランタイムは アプレットにファイルへのアクセスを許可することができます。 ファイル選択ダイアログが PrivilegedUrl オブジェクトを返した 場合でも、それを Url として処理する必要があります。

Web アクセスの制限と choose-location

choose-location ファイル ダイアログ ボックスでは、ユーザーはファイルを参照するだけでなく URL を直接入力することができます。これはユーザーが Web サイト上にあるファイルの URL を入力できることを意味します。ユーザーが Web サイトファイルの URL を入力すると、Curl ランタイムは Web サイトがアプレットにアクセスを許可する curl-access.txt を持っているかどうかに関わりなく、アプレットがそのファイルにアクセスできるようにします。
そのため、アプレットが Web サイト上のファイルにアクセスする必要があり、そのファイルに curl-access.txt ファイルが含まれていない場合、アプレットはユーザーにファイルの URL を手動で入力するよう要求することができます。

URL の文字エンコーディング

一部の文字、特に'%''?''#' は URL において特別な意味を持ちます。 その特別な意味をバイパスさせるには、その特殊文字をエンコードする必要があります。 parse-url を例とするいくつかのプロシージャは、必要な時に自動的に特殊文字をエンコードするようになっています。 しかし、 urlabs-url、または Url に属する様々なメソッドにパスする文字列は、特殊文字に関して url-encode-filename を使用するか、手記で既にエンコードされている必要があります。 url-encode-string プロシージャは、正確性を保つためにエンコードする文字の他、危険性の少ないその他の文字もエンコードするのに使用されます。 エンドユーザーからのインプットのような、URLを構成するのに使われ危険性のある文字を含む文字列に対して(時にクエリ文字列を作成する時に)使用することができます。

Url 情報の取得

要約:
  • Url クラスには URL の部分を分離するアクセッサがあります。
  • Url クラスには、一部を変更した自分のクローンを返すメソッドも含まれています。
Url クラスには、Url の表示する URl の一部を抽出することができるアクセッサが含まれています。次の図は、URL のどの部分をアクセッサが返すのかを示しています。
Figure: URL の部分
アクセッサを次に示します。
アクセッサ説明
anchorString リソース内の場所を識別するUrl のアンカー部を含む String を返します。URL にアンカーがない場合、このアクセッサは空の文字列を返します。
basenameUrl のファイル名で、右端のピリオドの前にあるすべてを含む String を返します。URL にアンカーがない場合、ファイル名全体が返されます。
extensionUrl で指定されたファイルの拡張子部分を含む String を返します。通常、extension はファイル名の最も右側にあるピリオド (.) とその右側にあるすべてです。ファイル名にピリオドが含まれていない場合、空の文字列が返されます。
filenameUrl 内のファイル名 (拡張子を含む) を含むString を返します。Url でファイル名が指定されていない場合 (たとえば Url のパスがディレクトリで終わっているか、最後にスラッシュ (/) が付いている)、filename は空の文字列を返します。
full-filenameUrl のパスが続くスキームを含む String を返します。言い換えると、これは完全な URL から queryanchor を除いたものです。
leafリソースのファイル システム内のパスを含む String を返します。スキーム、リソースのあるシステムの名前、アンカー、およびクエリ文字列が削除されます。
local-filenameローカル ファイル システム内の Url で識別されるファイルまたはディレクトリへのパスを含む String を返します。パスのフォーマットはローカル ファイル システムのネイティブ構文です。たとえば、Windows システムでは、local-filename は標準の / ではなく \ で区切られたパスを返します。Url がローカル ファイル システムにないファイルを表している場合 (たとえばスキームが http: の場合)、local-filenamenullを返します。
nameUrlString として表す完全な URL を返します。
parent-dirUrl で指定されたファイルを含むディレクトリの Directory オブジェクトを返します。詳細については、「ディレクトリ オブジェクト」のセクションを参照してください。
parent-dir-nameparent-dir と同様ですが、その結果は Directory ではなく String に返されます。
pathnameanchor を除いた Url で表される URL を含む String を返します。
pathname-tail完全なファイル名と Url のクエリ文字列 (ある場合) を含む String を返します。
queryUrl のクエリ文字列を含む String を返します。Url にクエリ文字列が含まれていない場合、query は空の文字列を返します。
separatorUrl のセパレータ文字を含む String を返します。これは通常スラッシュ (/) です。
stemUrl 内のスキームとシステム名を表す Directory オブジェクトを返します。詳細については、「ディレクトリ オブジェクト」セクションを参照してください。
次の例では、これらのアクセッサが URL を解釈する方法を示します。有効な URL を「URL To Analyze」 ボックスに入力し、Analyze URLをクリックしてアクセッサの返す内容を表示することができます。入力した URL は実際には何も解決する必要はありません。それは、この例では URL で指定されたリソースにアクセスしようとしないからです。エラー チェックは実行されません。そのため無効な URL の解析の結果、エラーになることがあります。相対 URL を「URL To Analyze」に入力できることにも注意してください。

例: URL の解析
{value
    let uribox:TextField =
        {TextField width=4in,
            value="http://www.example.com/scripts/example.cgi?search=yes#myanchor"}
    let results:Graphic = {Fill}
    let analyze:CommandButton =
        {CommandButton
            label = "Analyze URL",
            {on Action do
                || resolve the URL.
                let theurl:Url = {url uribox.value}
                set results =
                    {results.replace-with
                        {spaced-vbox
                            {text name is: {value theurl.name}},
                            {text anchor is: {value theurl.anchor}},
                            {text basename is: {value theurl.basename}},
                            {text extension is: {value theurl.extension}},
                            {text filename is: {value theurl.filename}},
                            {text full-filename is: {value theurl.full-filename}},
                            {text leaf is: {value theurl.leaf}},
                            {text local-filename is: {value theurl.local-filename}},
                            {text parent-dir-name is: {value theurl.parent-dir-name}},
                            {text pathname is: {value theurl.pathname}},
                            {text pathname-tail is: {value theurl.pathname-tail}},
                            {text query is: {value theurl.query}},
                            {text separator is: {value theurl.separator}}}}}}

    {spaced-vbox
        {spaced-hbox {text URL To Analyze: }, uribox, analyze},
        results}
}