Qual é a melhor maneira de fazer um multi-plataforma, a substituição de arquivo atômica em Perl?
-
23-08-2019 - |
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.
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.