2

1台のマシンを除くすべてのWindowsサーバーで、次のコードを実行して一時ファイルフォルダーを割り当てると、次のようになります。

use CGI;
my $tmpfile = new CGITempFile(1);
print "tmpfile='", $tmpfile->as_string(), "'\n";

変数$tmpfileには値が割り当てられ、'.\CGItemp1'これが私が望むものです。しかし、私のサーバーの1つでは、が正しく設定されていませんC:\temp\CGItemp1

すべてのサーバーは、Windows 2003 Standard Edition、IIS6、およびActivePerl 5.8.8.822を実行しています(Perlの新しいバージョンへのアップグレードはオプションではありません)。コマンドラインから、またはIISでCGIスクリプト(scriptmap .pl= c:\perl\bin\perl.exe "%s" %s)としてスクリプトを実行した場合、結果は常に同じです。

.\CGItemp1このPerlインストールを修正して、デフォルトで''を返すように強制するにはどうすればよいですか?

動作中のサーバーの1つからこのマシンにPerlフォルダー全体をコピーしたこともありますが、喜びはありません。

@Hometoast:

TMP' 'と' TEMP'環境変数をチェックしました。また$ENV{TMP}$ENV{TEMP}それらは同一です。

コマンドラインから、ユーザープロファイルディレクトリを指します。次に例を示します。

C:\DOCUME~1\[USERNAME]\LOCALS~1\Temp\1

IISでCGIスクリプトとして実行すると、どちらも次のことを示します。

c:\windows\temp

レジストリキーHKEY_USERS/.DEFAULT/Environmentでは、両方のサーバーに次のものがあります。

%USERPROFILE%\Local Settings\Temp

のActiveState実装はCGITempFile()、一時フォルダを生成する方法を決定するために、明らかに代替メカニズムを使用しています。

@ランガード:

本当の問題は、CGI.pmモジュールとアタッチメントの処理にあります。ファイルがサイトにアップロードされるときはいつでも、CGI.pmそれを一時的な場所に保存する必要があります。これを行うには、一時フォルダを割り当てるためにCGITempFile()内で呼び出されます。CGI.pm残念ながら使用できませんFile::Temp。とにかくありがとう。

@クリス:

それはたくさんの助けになりました。私は以前にソースをざっとスキャンしましCGI.pmたが、あなたの提案により、私は戻って、基礎となるアルゴリズムを理解するためにそれをより慎重に見るようになりました。私は物事を動かしましたが、奇妙なことに、元々c:\tempサーバー上にフォルダーがありませんでした。

一時的な修正を取得するために、c:\tempフォルダーを作成し、Webサイトの匿名ユーザーアカウントに関連するアクセス許可を設定しました。しかし、これは共有ボックスであるため、一時ファイルが削除されていても、そのままにしておくことはできませんでした。簡単に言うと、フォルダの名前をc:\temp別の名前に変更すると、魔法のように正しい' .\'フォルダパスが返されていました。また、顧客がサイトでFrontPage拡張機能を有効にしていることに気付きました。これにより、Webサイトフォルダーの匿名ユーザーアカウントの書き込みアクセスが削除されるため、このアクセス許可を再適用する必要がありました。そのフォルダが存在しなかったのに、なぜこの問題の最初CGITempFile()に戻ってきたのか、そしてなぜそれが魔法のように再び機能し始めたのかについて、私はまだ途方に暮れています。c:\temp

4

3 に答える 3

8

一時ディレクトリの名前は、CGI.pm$CGITempFile::TMPDIRECTORYの関数で保持され、初期化されます。find_tempdir一時ディレクトリを選択するアルゴリズムは、CGI.pm のドキュメントに記載されています ( -private_tempfiles を検索してください)。IIUC では、サーバーに C:\Temp フォルダーが存在する場合、CGI.pm はそれを使用します。チェックインしたディレクトリがfind_tempdir存在しない場合、現在のディレクトリ "." 使用されている。

これが役立つことを願っています。

于 2008-09-17T19:45:16.887 に答える
2

あなたの質問に対する直接的な答えではありませんが、File::Tempを使ってみましたか?

どのOSでも動作するように特別に設計されています。

于 2008-09-17T19:59:03.047 に答える
1

このスクリプトを実行している場合は、%TEMP% 環境変数をチェックして、異なるかどうかを確認してください。

IIS が実行されている場合は、レジストリの HKEY_USERS/.DEFAULT/Environment の下にある TMP と TEMP の値を確認してください。

于 2008-09-17T18:35:16.930 に答える