2

次のエラーが表示されます。

The cause of this exception was: 
    java.io.FileNotFoundException:
    //server/c$/folder1/folder2/folder3/folder4/folder5/login.cfm
    (Access is denied).

これを行うとき:

<cffile action="copy" 
    destination="#copyto#\#apfold#\#applic#\#files#"
    source="#path#\#apfold#\#applic#\#files#">

に書き込もうとするとC:\folder1\folder2\folder3\folder4\folder5\login.cfm、うまくいきます。この方法の問題点は、これが、開発者がファイルをアプリケーション フォルダーに手動で同期できるようにするためのスクリプトであることです。BigIP によってランダムに選択されたインスタンスごとに複数のサーバーがあります。したがって、C:\ ドライブに書き込むだけでは、開発者が現在アクセスしているサーバーにファイルがコピーされるだけです。したがって、開発者がブラウザを閉じてすぐに戻って変更が機能していることを確認したとしても、別のサーバーに送信された場合、変更は表示されません。

C:\ への書き込みで動作するので、パーミッションが正しいことはわかっています。また、エラーメッセージからパスをコピーしてサーバーのアドレスバーに配置したところ、フォルダー/ファイルに問題なく到達しました。そのサーバーへのアクセスを妨げているものは他にあるでしょうか?

4

3 に答える 3

1

サーバーで ftp を有効にしたくない場合は、RoboCopy を使用してサーバーの同期を維持するという別のオプションがあります。私はこのツールを使用して非常に幸運でした。ColdFusion タグにアクセスする必要cfexecuteがあり、サーバーに共有を作成する必要があります。

RoboCopy は、Windows に付属の実行可能ファイルです。ここここでいくつかのドキュメントを読むことができます。いくつかの非常に強力な機能があり、あるサーバーから別のサーバーにディレクトリの内容を「ミラーリング」するように設定できます。このモードでは、フォルダーを同一に保ちます (新しいファイルの追加、削除されたファイルの削除、更新されたファイルのコピーなど)。これが私がそれを使用した方法です。

基本的に、宛先サーバーに共有を作成し、特定のユーザー (ローカルまたはドメイン) にアクセスを許可します。ソース サーバーで、次のような ColdFusion コードを実行します。

  1. ドライブを宛先サーバーに論理的にマップする
  2. RoboCopy ユーティリティを実行してファイルを宛先サーバーにコピーします
  3. 次に、マップされたドライブを切断します

C:\WINDOWS\system32\net.exeソース サーバー上の ColdFusion サービスは、およびにアクセスする必要がありますC:\WINDOWS\system32\robocopy.exe。ColdFusion サンドボックス セキュリティを使用している場合は、これらの実行可能ファイルのエントリを追加する必要があります (ソース サーバーのみ)。基本的なコード例をいくつか示します。

まず、宛先サーバーにマップします。

<cfexecute name="C:\WINDOWS\system32\net.exe"
    arguments="use {share_name} {password} /user:{username}"
    variable="shareLog"
    timeout="30">
</cfexecute>

ここの {share_name} は のようなものになります\\server\c$。{username} と {password} は明らかなはずです。ユーザー名を として指定できます\\server\username 管理共有ではなく、作成した共有を使用することをお勧めしますc$が、それはあなたの例にあったものです。

次に、移行元サーバーから移行先サーバーにファイルをコピーします。

<cfexecute name="C:\WINDOWS\system32\robocopy.exe"
    arguments="{source_folder} {destination_folder} [files_to_copy] [options]"
    variable="robocopyLog"
    timeout="60">
</cfexecute>

ここの {source_folder} は次のようC:\folder1\folder2\folder3\folder4\folder5\になり、{destination_folder} は\\server\c$\folder1\folder2\folder3\folder4\folder5\. この引数は、上記の手順の {share_name} で開始し、その後に目的のディレクトリ パスを指定する必要があります。[files_to_copy] はファイルまたはワイルドカード ( *.*) のリストで、[options] は RoboCopy のオプションです。オプションの完全なリストについては、私が含めたリンクを参照してください。広範です。フォルダー構造をミラーリングするには、/Eおよび/PURGEオプションを参照してください。また、通常、生成される出力を制限するオプション/NDLとオプションも含めます。/NPそして、/XA:SHシステムと隠しファイルを除外します。そして、/XO古いファイルをわざわざコピーしないようにします。他のファイル/ディレクトリを明示的に、またはワイルドカードを使用して除外できます。

次に、マップされたドライブを切断します。

<cfexecute name="C:\WINDOWS\system32\net.exe"
    arguments="use {share_name} /d"
    variable="shareLog"
    timeout="30">
</cfexecute>

魅力のように機能します。この方法で RoboCopy を使用したことがない場合は、最初にコマンド ラインを使用してオプション/機能を試してみることを強くお勧めします。次に、好みに合わせて動作するようになったら、それらのオプションを上記のコードに貼り付けます。

于 2013-04-09T13:10:58.483 に答える