2

在我所有的 Windows 服务器上,除了一台机器,当我执行以下代码来分配一个临时文件夹时:

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

变量$tmpfile被赋值'.\CGItemp1',这就是我想要的。但在我的一台服务器上,它被错误地设置为C:\temp\CGItemp1.

所有服务器都运行 Windows 2003 标准版、IIS6 和 ActivePerl 5.8.8.822(升级到更高版本的 Perl 不是一个选项)。从命令行或在 IIS 中作为 CGI 脚本(其中 scriptmap .pl= c:\perl\bin\perl.exe "%s" %s)运行脚本时,结果始终相同。

我如何修复这个 Perl 安装并强制它.\CGItemp1默认返回“”?

我什至将整个 Perl 文件夹从其中一台工作服务器复制到这台机器上,但没有任何乐趣。

@Hometoast:

我检查了 ' TMP' 和 ' TEMP' 环境变量,$ENV{TMP}并且$ENV{TEMP}它们是相同的。

从命令行它们指向用户配置文件目录,例如:

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

当在 IIS 下作为 CGI 脚本运行时,它们都指向:

c:\windows\temp

在 registry keyHKEY_USERS/.DEFAULT/Environment中,两台服务器都有:

%USERPROFILE%\Local Settings\Temp

ActiveState 的实现CGITempFile()显然使用了一种替代机制来确定它应该如何生成临时文件夹。

@Ranguard:

真正的问题在于CGI.pm模块和附件处理。每当将文件上传到站点时,都CGI.pm需要将其临时存储在某个地方。为此,CGITempFile()在内部调用CGI.pm以分配一个临时文件夹。所以不幸的是我不能使用File::Temp. 不管怎么说,还是要谢谢你。

@克里斯:

这帮助了很多人。我之前确实快速浏览了CGI.pm源代码,但您的建议让我回过头来更加认真地查看它以了解底层算法。我得到了工作,但最奇怪的是服务器上最初没有c:\temp文件夹。

为了获得临时修复,我创建了一个c:\temp文件夹并为网站的匿名用户帐户设置了相关权限。但是因为这是一个共享框,所以即使临时文件正在被删除,我也不能那样做。长话短说,我将c:\temp文件夹重命名为不同的名称,并且神奇地返回了正确的 ' .\' 文件夹路径。我还注意到客户在网站上启用了 FrontPage 扩展,这会删除网站文件夹上匿名用户帐户的写入权限,因此需要重新申请此权限。我仍然不知道为什么在这个问题开始时CGITempFile()正在返回c:\temp,即使该文件夹不存在,以及为什么它神奇地再次开始工作。

4

3 回答 3

8

临时目录的名称保存在 CGI.pm$CGITempFile::TMPDIRECTORY的函数中并在函数中初始化。find_tempdirCGI.pm 文档中描述了选择临时目录的算法(搜索-private_tempfiles)。IIUC,如果服务器上存在 C:\Temp 文件夹,CGI.pm 将使用它。如果签入的目录都不find_tempdir存在,则当前目录为“。” 用来。

我希望这有帮助。

于 2008-09-17T19:45:16.887 回答
2

不是您问题的直接答案,但您是否尝试过使用File::Temp

它专为在任何操作系统上工作而设计。

于 2008-09-17T19:59:03.047 回答
1

如果您正在运行此脚本,请检查 %TEMP% 环境变量以查看它是否不同。

如果 IIS 正在执行,请检查注册表中 HKEY_USERS/.DEFAULT/Environment 下 TMP 和 TEMP 的值

于 2008-09-17T18:35:16.930 回答