メインコンテンツまでスキップ

FTP コマンドの実行 (ftp.cmd)

宣言​

result, err = ftp.cmd(URL, cmd [, connectTimeoutSec ])

パラメータ​

  • URL
    文字列型。アカウントとパスワードを含むリモート FTP URL です。ディレクトリ操作では、末尾が / のディレクトリ URL を使用してください。
  • cmd
    文字列型。MKD test などの FTP プロトコルのコマンドを 1 つ指定します。コマンドのテーブルは渡せません。
  • connectTimeoutSec
    実数型の任意指定パラメータ。接続のタイムアウト時間を秒単位で指定します。デフォルトは 10 です。リクエスト全体の所要時間は制限しません。

戻り値​

  • result
    文字列型または nil。リクエストが成功すると受信データを返します。空文字列の場合もあります。ディレクトリ URL の場合は通常ディレクトリ一覧であり、FTP コマンドのステータスコードや制御接続の応答ではありません。失敗すると nil を返します。
  • err
    文字列型または nil。失敗するとエラーの原因を説明する文字列を返します。成功時は 2 番目の値を返さないため、受け取る変数は nil になります。

説明​

FTP サーバーにコマンドを送信し、ディレクトリの作成などを行います。操作対象はサーバー上のファイルやディレクトリです。

コマンドは、URL で指定されたディレクトリに移動する前に実行されます。相対パスの基準はログイン後のデフォルトディレクトリです。例えば MKD uploads/test は、そのディレクトリ内の uploads に test を作成します。URL のパスでコマンドの作業ディレクトリが変わるとは考えないでください。コマンド内のパスはそのまま送信され、URL のパーセントデコードは行われません。

MKD は通常 1 階層のディレクトリしか作成しないため、親ディレクトリが既に存在する必要があります。ディレクトリが既に存在する場合、アカウントに権限がない場合、またはサーバーがそのコマンドに対応していない場合などには失敗することがあります。複数階層を作成するには、親から子の順に個別に呼び出してください。

現在の実装では、コマンド文字列に大文字の LIST または NLST が含まれていると、そのコマンドの送信を省略し、URL に対するデフォルトのリクエストのみを実行します。これらの文字列がディレクトリ名に含まれている場合も同様です。そのため、NLST を指定してもファイル名のみの一覧には切り替わらず、LIST -a の引数も反映されません。

コマンド実行後も URL に対応するデータを要求し、ディレクトリ URL の場合はディレクトリ一覧も取得します。その後の一覧取得やデータ接続に失敗すると、ディレクトリが既に作成されていても、関数は nil とエラーメッセージを返します。
この関数は実行権を譲る場合があり、戻るまでの間にほかの スレッド が実行される可能性があります。

簡単な例​

アカウントとパスワードは URL に記述します。URL の形式は次のとおりです(角括弧内は省略可能です):

ftp://[user:password@]host[:port]/path

アカウントまたはパスワードに @、:、/ が含まれる場合は、それぞれ %40、%3A、%2F でエスケープできます。URL で使用できないその他の文字には、URL のパーセントエンコードを使用できます。 例えば、アカウント havonz、パスワード 11@@22 で、ログイン後のデフォルトディレクトリに test を作成します:

local result, err = ftp.cmd("ftp://havonz:11%40%[email protected]/", "MKD test", 10)
if result == nil then
sys.alert("作成に失敗しました:" .. tostring(err))
else
sys.alert("作成しました")
end

複雑な例​

demo、demo/logs の順に作成します。どちらもまだ存在しないことが前提です。途中で失敗したら停止します。それまでに作成したディレクトリは自動削除されません。

local url = "ftp://havonz:11%40%[email protected]/"

for _, path in ipairs({ "demo", "demo/logs" }) do
local result, err = ftp.cmd(url, "MKD " .. path, 10)
if result == nil then
sys.alert("作成に失敗しました " .. path .. ": " .. tostring(err))
return
end
end

sys.alert("ディレクトリの作成が完了しました")

注:上記のコードでは、この章以外の関数 sys.alert を使用しています。