Pergunta

Em todos os meus servidores Windows, exceto por uma máquina, quando eu executar o código a seguir para atribuir um arquivos temporários pasta:

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

O $tmpfile variável é atribuído o valor '.\CGItemp1' e é isso que eu quero. Mas em um dos meus servidores é incorretamente definido para C:\temp\CGItemp1.

Todos os servidores estão executando o Windows 2003 Standard Edition, IIS6 e ActivePerl 5.8.8.822 (upgrade para a versão mais recente do Perl não é uma opção). O resultado é sempre o mesmo ao executar um script a partir da linha de comando ou no IIS como um script CGI (onde de script .pl = c:\perl\bin\perl.exe "%s" %s).

Como posso corrigir esta instalação Perl e forçá-lo a voltar '.\CGItemp1' por padrão?

Eu mesmo copiado toda a pasta Perl de um dos servidores que trabalham para esta máquina, mas nenhuma alegria.

@Hometoast:

Eu verifiquei o 'TMP' e 'TEMP' variáveis ??de ambiente e também $ENV{TMP} e $ENV{TEMP} e eles são idênticos.

A partir da linha de comando que apontar para o diretório de perfil de usuário, por exemplo:

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

Quando executado sob o IIS como um script CGI que ambos apontam para:

c:\windows\temp

Na chave de registro HKEY_USERS/.DEFAULT/Environment, ambos os servidores têm:

%USERPROFILE%\Local Settings\Temp

A implementação ActiveState de CGITempFile() está claramente usando um mecanismo alternativo para determinar como deve gerar a pasta temporária.

@Ranguard:

O problema real é com o módulo CGI.pm e manuseio anexo. Sempre que um arquivo é enviado para as necessidades local CGI.pm para armazená-lo em algum lugar temporário. Para fazer isso CGITempFile() é chamado dentro CGI.pm para alocar uma pasta temporária. Então, infelizmente eu não posso usar File::Temp. Obrigado na mesma.

@ Chris:

Isso ajudou um monte. Eu tinha uma verificação rápida através da fonte CGI.pm mais cedo, mas sua sugestão me fez voltar e olhar mais cuidadosamente para entender o algoritmo subjacente. Eu tenho coisas a trabalhar, mas a coisa mais estranha é que havia originalmente nenhuma pasta c:\temp no servidor.

Para obter uma correção temporária Eu criei uma pasta c:\temp e definir as permissões relevantes para a conta de usuário anônimo do site. Mas porque esta é uma caixa compartilhada eu não podia deixar as coisas dessa maneira, mesmo que os arquivos temporários foram sendo excluído. Para cortar uma longa história curta, eu renomeado a pasta c:\temp para algo diferente e magicamente o '.\' caminho pasta correta estava sendo devolvidos. Notei também que o cliente tinha permitido extensões do FrontPage no site, que remove o acesso de escrita para a conta de usuário anônimo nas pastas do site, assim que esta permissão necessária re-aplicação. Eu ainda estou em uma perda a respeito de porque no início desta questão CGITempFile() estava retornando c:\temp, embora essa pasta não existia, e por isso magicamente começou a trabalhar novamente.

Foi útil?

Solução

O nome do diretório temporário é realizada em $CGITempFile::TMPDIRECTORY e inicializado na função find_tempdir em CGI.pm. O algoritmo para escolher o diretório temporário é descrito na documentação CGI.pm (procurar -private_tempfiles ). IIUC, se uma pasta C: \ Temp existe no servidor, CGI.pm vai usá-lo. Se nenhum dos diretórios check-in exist find_tempdir, em seguida, o diretório atual "" é usado.

Espero que isso ajude.

Outras dicas

Nem a resposta directa à sua pergunta, mas você já tentou usar File :: Temp ?

Ele é projetado especificamente para trabalhar em qualquer sistema operacional.

Se você estiver executando este script como você, verifique a variável de ambiente% TEMP% para ver se se for diferente.

Se o IIS está em execução, verifique os valores no registro para TMP e TEMP sob HKEY_USERS / .DEFAULT / Meio Ambiente

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top