2008-09-17 65 views
2

在我所有的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文件夾從一臺工作服務器複製到了這臺機器上,但沒有喜悅。

@Hometoast:

我查了 '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的實現顯然是用一種替代機制,以決定應如何生成的臨時文件夾。

@Ranguard:

真正的問題是與CGI.pm模塊和附件處理。每當文件上傳到網站CGI.pm需要將其存儲在臨時的某處。在CGI.pm內調用CGITempFile()來分配一個臨時文件夾。所以不幸的是我不能使用File::Temp。不管怎麼說,還是要謝謝你。

@Chris:

這幫助了一堆。我之前通過CGI.pm源文件進行了快速掃描,但是您的建議讓我回過頭來更仔細地瞭解底層算法。我得到了一些工作,但最奇怪的是服務器上最初沒有c:\temp文件夾。

要獲得臨時修復,我創建了一個c:\temp文件夾併爲該網站的匿名用戶帳戶設置相關權限。但是因爲這是一個共享的盒子,所以即使臨時文件被刪除,我也無法保持這種狀態。長話短說,我將c:\temp文件夾重命名爲不同的東西,神奇的是,正在返回正確的'.\'文件夾路徑。我還注意到,該客戶已啓用該網站上的FrontPage擴展,從而刪除了網站文件夾上的匿名用戶帳戶的寫入訪問權限,因此需要重新應用此權限。我仍然不知道爲什麼在這個問題開始時CGITempFile()正在返回c:\temp,儘管該文件夾不存在,爲什麼它神奇地再次開始工作。

回答

8

的臨時目錄的名稱在$CGITempFile::TMPDIRECTORY舉行並初始化的find_tempdir功能CGI.pm 。 CGI.pm文檔中描述了用於選擇臨時目錄的算法(搜索-private_tempfiles)。 IIUC,如果服務器上存在C:\ Temp文件夾,CGI.pm將使用它。如果find_tempdir中檢查的目錄都不存在,則當前目錄「。」用來。

我希望這會有所幫助。

1

如果您正在運行此腳本,請檢查%TEMP%環境變量以確定它是否有所不同。

如果IIS執行,檢查TMP和在註冊表中的值TEMP下 HKEY_USERS/.DEFAULT /環境

2

不是你的問題的直接答案,但你有沒有嘗試過使用File::Temp

它專門設計用於任何操作系統。