Qual é a melhor maneira de fazer um multi-plataforma, a substituição de arquivo atômica em Perl?

StackOverflow https://stackoverflow.com/questions/392016

Pergunta

Eu tenho uma situação muito comum. Eu tenho um arquivo, e eu preciso substituir inteiramente esse arquivo com novos conteúdos. No entanto, o arquivo original é acessado em cada carregamento da página (este é um aplicativo web), por isso não pode estar ausente por muito tempo. Alguns ms é OK (embora não ideal), um segundo não é OK.

Agora eu fazer isso escrevendo um arquivo temporário para o mesmo diretório e, em seguida, renomear o arquivo temporário para o nome do novo arquivo. Estou apenas usando o arquivo normal :: Temp e "renomeação" de fazer isso, em Perl. Eu queria saber - há algum outro recomendado melhor maneira / fazer isso? De preferência um que não requer um módulo CPAN, pois este é o único lugar no meu sistema que eu preciso fazer isso, e eu não quero uma nova dependência inteiro apenas para isso.

Oh, e tudo isso tem que trabalhar em Windows, Linux, BSD, OS X, Solaris, ea maioria das outras plataformas comuns.

Aqui está o código em questão , para os interessados.

Foi útil?

Solução

Seu método parece muito bem. É rápido, é atômica, ele usa apenas módulos principais, e File :: Temp é uma maneira segura de lidar com arquivos temporários. O que mais você precisa?

Outras dicas

Eu faria isso da mesma maneira que você está fazendo isso. Pelo menos em sistemas operacionais do tipo Unix, uma renomeação de arquivos é garantido para ser atômica, assim você não terá quaisquer instantes onde o original ou os novos arquivos não está lá.

Rename é suficiente. No entanto:

é seu arquivo temporário em risco de condições de corrida? O nome do arquivo deve ser randomizados para que ninguém possa causar problemas, inserindo seu próprio arquivo. Use uma interface para mkstemp (), se possível.

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