在我所有的Windows服務器,除了一臺機器,當我執行下面的代碼來分配臨時文件的文件夾:CGI.pm通常創建臨時文件在哪裏?
use CGI;
my $tmpfile = new CGITempFile(1);
print "tmpfile='", $tmpfile->as_string(), "'\n";
變量被賦值爲'.\CGItemp1'
這就是我想要的。但在我的一臺服務器上,它被錯誤地設置爲C:\temp\CGItemp1
。
所有服務器都運行Windows 2003 Standard Edition,IIS6和ActivePerl 5.8.8.822(升級到更高版本的Perl不是一個選項)。從命令行運行腳本或在IIS中以CGI腳本(其中腳本映射.pl
= c:\perl\bin\perl.exe "%s" %s
)運行腳本時,結果始終相同。
我該如何修復這個Perl安裝並強制它默認返回'.\CGItemp1
'?
我甚至已經將整個Perl文件夾從一臺工作服務器複製到了這臺機器上,但沒有喜悅。
我查了 'TMP
' 和 'TEMP
' 環境變量,也$ENV{TMP}
和$ENV{TEMP}
和他們是一樣的。
從命令行它們指向的用戶配置文件目錄,例如:
C:\DOCUME~1\[USERNAME]\LOCALS~1\Temp\1
當作爲CGI腳本它們都指向IIS下運行:
c:\windows\temp
在註冊表項HKEY_USERS/.DEFAULT/Environment
,兩個服務器有:
%USERPROFILE%\Local Settings\Temp
的CGITempFile()
的ActiveState的實現顯然是用一種替代機制,以決定應如何生成的臨時文件夾。
真正的問題是與CGI.pm
模塊和附件處理。每當文件上傳到網站CGI.pm
需要將其存儲在臨時的某處。在CGI.pm
內調用CGITempFile()
來分配一個臨時文件夾。所以不幸的是我不能使用File::Temp
。不管怎麼說,還是要謝謝你。
這幫助了一堆。我之前通過CGI.pm
源文件進行了快速掃描,但是您的建議讓我回過頭來更仔細地瞭解底層算法。我得到了一些工作,但最奇怪的是服務器上最初沒有c:\temp
文件夾。
要獲得臨時修復,我創建了一個c:\temp
文件夾併爲該網站的匿名用戶帳戶設置相關權限。但是因爲這是一個共享的盒子,所以即使臨時文件被刪除,我也無法保持這種狀態。長話短說,我將c:\temp
文件夾重命名爲不同的東西,神奇的是,正在返回正確的'.\
'文件夾路徑。我還注意到,該客戶已啓用該網站上的FrontPage擴展,從而刪除了網站文件夾上的匿名用戶帳戶的寫入訪問權限,因此需要重新應用此權限。我仍然不知道爲什麼在這個問題開始時CGITempFile()
正在返回c:\temp
,儘管該文件夾不存在,爲什麼它神奇地再次開始工作。