Macromedia Director非公式テクニカルノート

ファイルをコピーする

ID: FN0201002 Product: Director

Platform: All
Viersion: 7.0 and above

CD-ROMなどから、別のディスクにデータをコピーする手法をご紹介します。

1. ビルトインコマンドdownloadNetThingを使う
Directorの'downloadNetThing'コマンドについて、マニュアル上はファイルをコピーする機能についての記述はありません。ですから、正規サポートされる機能であるかどうかについては、明示されていません。まず、この点に留意したうえで、ご利用ください。

'downloadNetThing'を使えば、ローカルディスク間でもデータをコピーすることができます。このコマンドの本来の用途は、名前のとおりインターネットからローカルディスクにファイルをダウンロードすることです。

[シンタックス]
downloadNetThing(URL, ローカルファイル)

'downloadNetThing'は、2つのパラメータを必要とします。元データの場所となる[URL]とコピー先の場所となる[ローカルファイル]です(詳しくは『Lingo辞書』またはオンラインヘルプを参照)。ここにそれぞれ元ファイルとコピー先ファイルの完全パスを指定すれば、ローカルディスク上でコピーができます。

もうひとつ説明を加えておきます。'downloadNetThing'は、コマンドですが、関数のように値を返すということです。どのような値が返るかは、メッセージウィンドウで'put'を実行すれば、簡単に確認ができます。つぎのようなステートメントをメッセージウィンドウで実行すると、このサイトのロゴのGIFファイルがムービーと同じ階層にコピーされます。

[メッセージウィンドウでのテスト例]
sURL = "http://www.FumioNonaka.com/TechNotes/Images/FumioNonaka.gif"
put downloadNetThing(sURL, the moviePath & "FumioNonaka.gif")
-- 1

関数には必ず括弧()がつきます。括弧をつけなくてもコマンドとしては実行されますが、値が返りません。パラメータは、その括弧の中に記述します。ここでは、1という数字が返りました。パラメータを変えて実行するたびに、返ってくる数字は変わると思います。この数字は「ネットID」と呼ばれます。いってみれば、ネットワーク操作の受付番号です。このネットIDを使って、その操作の現在の状態や、エラーなどを確認することができるのです。

2. 指定したパスにファイルをコピーするスクリプト
'downloadNetThings'コマンドを使って、指定したパスにファイルをコピーするスクリプトを書いてみましょう。これは、ムービースクリプトとして設定します。

-- [指定したパスにファイルをコピーする]
on xCopyFile(sSourceFile, sTargetFile)
   downloadNetThing(sSourceFile, sTargetFile)
end

ステートメント1行のカスタムハンドラです。'downloadNetThing'コマンドの第1引数にURLでなくコピー元のパスを指定すると、コピー元ファイルを第2引数のパスにコピーすることができます。ハンドラには汎用性をもたせるために、やはり2つの引数を指定することにしました。引数は括弧()でくくってありますが、スペースでも結構です。この段階では、'downloadNetThing'コマンドをxCopyFileハンドラに置換えたに過ぎません。けれど、カスタムハンドラとして作成しておけば、機能を拡張することができます。

ちなみに、スクリプトを記述する際には、カスタムハンドラであることがわかる決まりごとをつくっておくと管理しやすくなります。ここでは、小文字xで始まるハンドラ名をつけることにしましょう。変数名にも頭に小文字がつけてあります。sは文字列(string)を意味します。数値(numeral)にはnをつけることにしましょう。

メッセージウィンドウで試してみます。ムービーと同階層にあるファイル"Test.txt"を同じ階層の"CopyTest.txt"としてコピーするには、以下を実行します。

[メッセージウィンドウでのテスト例]
put xCopyFile the moviePath & "Test.txt", the moviePath & "CopyTest.txt"

ステートメントで実行している'downloadNetThing'はパラメータを括弧に入れて、関数形式にしました。ただ、このままではネットIDが取得されません。値を変数に格納して、実行結果にエラーがないかどうかを確認することにしましょう。エラーコードは'netError'関数で調べることができます。

[シンタックス]
netError(ネットID)

'netError'関数のパラメータにネットIDを渡すと、そのネットIDの操作のエラーコードが返ります('netError'関数については『Lingo辞書』またはオンラインヘルプ参照)。

-- [パスを指定してファイルをコピーする − 処理を追加 −]
on xCopyFile(sSourceFile, sTargetFile)
   nID = downloadNetThing(sSourceFile, sTargetFile)
   nResult = netError(nID)
   return nResult
end

'downloadNetThing'の実行時、処理のネットIDを変数nIDに格納しています。そして、そのnIDを'netError'関数に渡して、処理のエラーコードを取得します。ポイントは最後の'return'です。このキーワードは、'exit'と同じくハンドラを終了します。しかし、ただ終了するだけでなく、'return'の後に記述された値をハンドラの値として返すのです。したがって、このカスタムハンドラは、処理を終えると'downloadNetThing'の操作についてのエラーコードを返すことになります。正しく処理を終えると、"OK"が返ります。その他のエラーコードについては『Lingo辞書』またはオンラインヘルプの'netError'を参照してください(マニュアルには、エラーがないとき0が返るとありますが、正しくは"OK"です)。

メッセージウィンドウで試してみます。カスタムハンドラ'xCopyFile'は、処理を終えると'return'で値を返す関数になりました。ですから、メッセージウィンドウで試す際には、括弧をつけて関数形式にします。

[メッセージウィンドウのテスト結果]
put xCopyFile(the moviePath & "Test.txt", the moviePath & "CopyTest.txt")
-- "OK"

注意すべき点を、3つ補足しておきます。まず、繰り返しになりますが、'downloadNetThing'コマンドを使ってローカル上でファイルをコピーする用法は、ドキュメントに明記されていません。筆者の元には、この使用でとくに問題が生じたという情報はありません。けれど、正規サポートされるかどうかについては、確実ではありません。つぎに、コピー先パスに同名のファイルがすでに存在する場合には、とくにメッセージを表示することもなく上書きコピーされます。さらに、Macintoshの場合、ファイルのクリエータ情報はコピーされません。

3. サードパーティ製エクストラを使う
サポートの確実性やパスの確認、ファイルのクリエータ、エラーの詳細な扱いなどを考えると、サードパーティ製エクストラを使うのがよいでしょう。Macromediaテクニカルノート「FileXtra 情報」の(追加情報)には、FileXtra 2.0.5を使用したサンプルスクリプトが紹介されています。カスタムハンドラの引数やコピー元ファイルの存否もチェックした実用的なスクリプトです。興味のある方は、一読されることをお勧めします。

*注記
FileXtraは、本稿作成日現在では、FileXtra3 Ver. 3.01がリリースされています。メジャーアップデートで、メソッドの実行方法やコマンド名が、Ver. 2とは大きく異なっています。使用する際には、必ず付属のドキュメントをご参照ください。

*注記2
2002年12月21日付けで、FileXtra4のMacintosh版がリリースされました。Director MXとMacOS Xに対応しています。

ここでは、サードパーティ製エクストラとして定評のあるBuddy APIを使ったスクリプトをご紹介します。2の'downloadNetThing'を使った例や前掲Macromediaテクニカルノートのサンプルと比べると、引数がひとつ増えて3つになっています。これは、Buddy APIの'baCopyFile'メソッドが、上書き指定のための引数をもっていることに対応したものです。カスタムハンドラxCopyFileの3つ目の引数に'true'を指定すると、コピー先に同名のファイルがあっても上書きします。この引数を省略すれば、すでに存在するファイルは上書きされません。

[メッセージウインドウでのテスト例]
put xCopyFile(the moviePath & "Test.txt", the moviePath & "CopyTest.txt", true)
-- 0

ハンドラを実行して返される整数は、Buddy APIの'baCopyFile'メソッドの戻り値です。0は、正しく実行されたことを示します。'baCopyFile'のメソッドやその戻り値について詳しくは、別途リファレンスの「Buddy API: baCopyFile」およびエクストラ添付のドキュメントをご参照ください。

-- [指定したパスにファイルをコピーする]
on xCopyFile(sSourceFile, sTargetFile, bOverwrite)
   -- 3番目の引数bOverwriteの値によって'baCopyFile'メソッドに渡すオプションのストリングを設定
   -- *'baCopyFile'メソッドに渡す[上書き指定]オプションの設定については前掲のドキュメントを参照
   if (bOverwrite) then -- bOverwriteが'true'の場合
     sOverwrite = "Always"
   else -- bOverwriteが未指定その他'true'以外のすべての場合
     sOverwrite = "IfNotExist"
   end if
   nResult = baCopyFile(sSourceFile, sTargetFile, sOverwrite)
   return nResult
end

_____

作成者: 野中文雄
更新日: 2002年12月24日 リンクや関連情報のデータを更新
作成日: 2002年1月11日


Copyright © 2001-2006 Fumio Nonaka.  All rights reserved.