012

FTP サイトのディレクトリー・リストと、アイコン付きリスト作成

libURLSetFTPListCommand {"LIST" | "NLST"}
URLEncode, hilitedButtonName, imageSource


RR Player に 012.rev と入れてスタックをダウンロードしてください。
Revolution の開発環境がある方は、メッセージボックスに
go stack url "http://www.kenjikojima.com/runrev/handbook/download/012.rev"
とタイプしてリターンキーを叩く事でもダウンロードできます。

011 でパスワードのフィールドが使えるようになったので、さっそくサーバーインフォ記入のフィールドを作って、 FTP サーバーのディレクトリー・リストを作ってみましょう。さらに最後でフィールドにあるそれぞれのリストに、ファイルやディレクトリーのアイコンを付けてみます。

Revolution のインターネットライブラリーに libURLSetFTPListCommand というのがあって、簡単にFTP ディレクトリーのリストを得ることができます。 libURLSetFTPListCommand では2種類のパラメータが使えて、パラメータ NLST ではファイル名だけ、LIST ではファイル名以外にパーミッション、オーナー、サイズ、最終変更日などのインフォを取得することができます。012.rev ではラジオボタンによってパラメーターの選択を行っています(下図のようなリストが取得できます)。








「リスト作成」ボタン内には、以下のスクリプトが入っています。


on mouseUp
put "" into fld "list"
set cursor to watch
put fld "userName" into tUserName
put the cPassword of fld "password" into tUserPassword
put fld "directory" into tDirectory
if the last char of tDirectory <> "/" then put "/" after tDirectory
put "ftp://" & URLEncode(tUserName) & ":" & URLEncode(tUserPassword) \
& "@"& tDirectory into fileURLToGet

switch (the hilitedButtonName of group "whichList")
case (NLST)
libUrlSetFtpListCommand "NLST"
break
case (LIST)
libUrlSetFtpListCommand "LIST"
break
end switch
put URL fileURLToGet into fld "list"

if the result is not empty then
put the result into fld "list"
end if
end mouseUp



まず、ユーザー名、パスワード、ディレクトリーを、libUrlSetFtpListCommand で使えるように

ftp://username:userpassword@directory

という形にまとめるのですが、ユーザー名、パスワードはサーバーが受けられるよう記号等を変換する URLEncode で変換してから、コンテナー(fileURLToGet)に入れます。2種類のパラメータのどちらが選択されているかの判断は、グループ内のどのボタンがハイライトかを判断する

the hilitedButtonName of group

で得ることができますから、switch で選り分けてから、libUrlSetFtpListCommand を使っています。switch でそれぞれのコマンドを別々に書いているのは、 "NLST" か"LIST" のパラメータはコンテナーに入れて置き換えることができないためです。

libUrlSetFtpListCommandの直後に、 URL "ftp://username:userpassword@directory" を行うことでディレクトリー・リストが取得できますから、 put でフィールド「list」に入れています。 the result が empty の場合、上記コマンドでリストは取得されていますが、問題が出た場合にはエラーメッセージが the result に入ります。


ここまでは辞書にある内容を、少し具体性を持たせて書いているだけです。では、このコマンドを使って、リストの各行がディレクトリーか、ファイルかをアイコンで表示してみましょう。下図のような結果となります。





まず、上記コマンドのパラメータ LIST で得られたパーミッションの character 1 が
 d:ディレクトリー
 -:ファイル
 l:"->" 以下をオリジナルファイルにもつ「シンボリックリンク」
ということに注目して、それぞれのアイコンを行の先頭に付けます。シンボリックリンクというのをMac OSX で使うエイリアスのアイコンにしてみましたが、もっと適当なものがあったらお知らせください。
アイコンをスタック内に用意するには、フォトショッップなどで作ったイメージ(ファイル形式は JPEGでもGIFF でも、PING でもかまいません)を、File メニュー > Import As Controll > Image File...でスタックのどこにでも良いですから、インポートします。私の場合は、スタックの最後に images という隠しカードを1枚作って、そこにすべてのアイコンや、ボタンイメージ、MacOSX のメニューをまとめることが多いです。(Mac OS のメニューをメニューバーに設置すると、メニューに使ったボタングループの分だけそのカードが短くなるので、他のカードとの統一をとるためにも隠しカードが必要です)インポートしたイメージは、オブジェクトインスペクターに見えるように、ID が振り当てられています。



もしオブジェクトインスペクターの Source にパスが入っているような場合は、イメージがうまくインポートされていませんから、スタンドアロンにした時にイメージが使えません。012.rev でインポートしたアイコンイメージは、ディレクトリー ID 1018、ファイル ID 1019、シンボリックリンク ID 1020 となっています。

set the imageSource of character to imageID

で、任意のキャラクターをイメージにすることができますから、

「アイコン付きリスト作成」ボタンの前半は、libUrlSetFtpListCommand "LIST" でパーミッションを含むインフォを取得しています。


libUrlSetFtpListCommand "LIST" の部分略


if the result is not empty then
put the result into fld "list"
else
if word 1 of line 1 of fld "list" is "total" then \
delete line 1 of fld "list"
repeat with i=1 to the num of lines of fld "list"
put "@ " before line i of fld "list"
switch (char 3 of line i of fld "list")
case "d"
set the imageSource of char 1 of line i of fld "list" to 1018
break
case "-"
set the imageSource of char 1 of line i of fld "list" to 1019
break
case "l"
set the imageSource of char 1 of line i of fld "list" to 1020
break
end switch
delete word 2 to 9 of line i of fld "list"
end repeat
end if



libUrlSetFtpListCommand の the result がempty なら、行の先頭に "@ " というキャラクターを置いて(キャラクターは何でもかまいません)、the imageSource of character でそれぞれのアイコンイメージに置き替えています。repeat 内の最後の行は、パーミッションとファイル名以外を取り除く処置です。

順序からちょっと言いそびれてしまいましたが、

if word 1 of line 1 of fld "list" is "total" then
delete line 1 of fld "list"


と、始めに入れているのは、サーバーによって libUrlSetFtpListCommand "LIST" で得たリストの先頭に「total 32」のような記述が入る場合があるので、そのチェックをしてもし記述があるようなら、アイコンが不必要なのでその行を削除しています。これ以外に、サーバーによる違いの行をご存知の方はお知らせください(よろしく!)。


libUrlSetFtpListCommand の注意点:
1)上で言ったように、サーバーによっては得られる情報が変わってきます。あるいは安全を考えて、 repat 内でパーミッションの行か、 total number のようなそうでない行かを、すべてチェックする方法のほうが良いかもしれませんね。
2) libURLSetFTPListCommand は、インターネットライブラリーに含まれますから、スタンドアロンにする場合必ず、Standalone Application Settings... で、Script Libraries: の「internet」をハイライトにしてください(下図)。



the imageSource of character の注意点:
1)アイコンイメージの天地サイズがフィールドで指定してある行間(textHeight) を越えると、イメージがカットされてしまいます。012.rev ではアイコンの天地を13ピクセル、フィールドの textHeight は 14 としています。フィールドの行間は、オブジェクトインスペクターで Fixed Line Height にチェックマークをして、Text height のナンバーで変えられます。
2)キャラクターを変えるイメージは ID でなく、イメージネーム、イメージのパスでもできます。デフォルトフォルダーなどにある外部ファイルのイメージパスを、バイナリーファイル(binfile) で以下のように使います。

set the imageSource of char 1 of fld "list" to \
"binfile:"&the defaultFolder &"/iconD.gif"



011 / 012 / 013

わかりにくい事がありましたら、遠慮なくメールしてください。
index@kenjikojima.com