2008-09-17 9 views
2

은 :일반적으로 CGI.pm은 임시 파일을 어디에 생성합니까? 나는 다음과 같은 코드는 임시 파일 폴더에 할당 실행할 때 하나의 시스템을 제외한 모든 내 Windows 서버에서

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

변수 $tmpfile을 값 '.\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}을 확인하고는 동일입니다.

명령 줄에서

그들은 예를 들어, 사용자 프로파일 디렉토리를 가리 키 :

: CGI 스크립트 둘 점으로 IIS에서 실행

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

c:\windows\temp

레지스트리 키 HKEY_USERS/.DEFAULT/Environment 0

는 두 서버가 있습니다 CGITempFile()의 ActiveState의 구현이 명확하게 임시 폴더를 생성하는 방법을 결정하기 위해 다른 메커니즘을 사용

%USERPROFILE%\Local Settings\Temp

.

@Ranguard:

진짜 문제는 CGI.pm 모듈 및 부착 처리로이다. 파일이 사이트에 업로드 될 때마다 CGI.pm은 임시 어딘가에 저장해야합니다. 이렇게하려면 CGITempFile()CGI.pm 내에서 호출되어 임시 폴더를 할당하십시오. 불행히도 File::Temp을 사용할 수 없습니다. 어쨌든 고마워. 무리 도움

@Chris:

. 이전에 CGI.pm 소스를 통해 빠른 스캔을했지만 귀하의 제안으로 돌아가서 기본 알고리즘을 이해하기 위해 좀 더 신중하게 검토했습니다. 이상한 점은 원래 서버에 c:\temp 폴더가 없었기 때문입니다.

임시 수정본을 얻으려면 c:\temp 폴더를 만들고 웹 사이트의 익명 사용자 계정에 대한 관련 권한을 설정하십시오. 하지만 이것은 공유 된 상자이기 때문에 임시 파일이 삭제 되더라도 그런 식으로 남겨 둘 수는 없습니다. 긴 이야기를 짧게 줄이기 위해 c:\temp 폴더의 이름을 다른 것으로 바꿨으며 마술로 올바른 '.\'폴더 경로가 반환되었습니다. 또한 고객이 웹 사이트 폴더의 익명 사용자 계정에 대한 쓰기 권한을 제거하는 사이트의 FrontPage 확장을 사용하도록 설정 했으므로이 권한을 다시 적용해야했습니다. 나는이 문제의 시작 부분에서 왜 이 그 폴더가 존재하지 않았고 마술처럼 다시 작업하기 시작 했음에도 불구하고 c:\temp을 반환하는 이유에 대해 여전히 분실하고 있습니다.

답변

8

임시 디렉토리의 이름은 CGI.pm에 find_tempdir 기능에 $CGITempFile::TMPDIRECTORY에서 개최 초기화됩니다 HKEY_USERS 아래에있는 TMP에 대한 레지스트리 값과 온도를 확인 . 임시 디렉토리를 선택하는 알고리즘은 CGI.pm 문서에 설명되어 있습니다 (-private_tempfiles 검색). IIUC, C : \ Temp 폴더가 서버에 있으면 CGI.pm이 사용합니다. find_tempdir에서 검사 된 디렉토리가 없으면 현재 디렉토리 "." 사용.

이 정보가 도움이되기를 바랍니다.

1

이 스크립트를 실행중인 경우 % TEMP % 환경 변수가 다른지 확인하십시오. IIS가 실행되면

/.DEFAULT/환경

2

질문에 대한 직접적인 대답이 아니지만 File::Temp을 사용해 보셨습니까?

이것은 모든 OS에서 작동하도록 특별히 설계되었습니다.