Qual é o benefício de gravar em um local temporário e copiá-lo para o destino pretendido?

48

Estou escrevendo um aplicativo que funciona com imagens de satélite, e meu chefe me pediu para examinar alguns aplicativos comerciais e ver como eles se comportam. Eu encontrei um comportamento estranho e, em seguida, como eu estava, também o encontrei em outros aplicativos padrão.

Esses programas primeiro gravam na pasta temporária e depois copiam para o destino pretendido.

Exemplo: 7zip primeiro extrai para a pasta temp e depois copia os dados extraídos para o local para o qual você pediu para extrair os dados.

Vejo vários problemas com essa abordagem:

  1. A pasta temporária pode não ter espaço suficiente, enquanto o local pretendido pode ter muito espaço.

  2. Se for um arquivo grande, pode levar um tempo não negligenciável para a operação de cópia.

Eu pensei muito sobre isso, mas não consegui ver um único ponto positivo para fazer isso. Estou faltando alguma coisa ou há um benefício real em fazer isso?

Devdatta Tengshe
fonte
Se o aplicativo exigir, faça-o. Caso contrário, faça o que faz sentido. Seu cérebro está lhe dizendo que não é necessário neste caso. Estou no campo de fazer a menor quantidade de trabalho possível, como você pode dizer pela minha resposta, por isso recomendo fazer a menor quantidade de trabalho possível para o aplicativo.
Jason Sebring
1
Tem certeza de que está "copiando" o arquivo e não "movendo-o"? Grande diferença.
frankc
No blogs.rsa.com/… , para malwares, a vantagem é: 1) Gravação garantida evita a detecção de "erro vermelho" antes que você tenha baixado completamente o vírus no computador do usuário. 2) Os discos TEMP são geralmente mais rápidos (RAMDisk), reduzindo o tempo para detecção enquanto o vírus ainda está em baixar fase (uma vez que o vírus está totalmente formada e gerida para executar para 0,05 segundos, o jogo acabou, por isso é uma corrida de tempo)
Pacerier
3) Enquanto você estiver baixando ou executando, se um antivírus colidir com você (sem saber, às vezes) e deixar seus ossos por aí, você ainda poderá contar com uma chance de x% de que o sistema operacional ou o usuário acidentalmente o ajudem a excluir seus ossos mortos, enquanto eles limpam em massa as coisas da pasta TEMP, isso ajuda a reduzir a probabilidade de detecção.
Pacerier

Respostas:

96

Algumas razões pelas quais posso pensar:

  • Na maioria das plataformas, as movimentações de arquivos são atômicas, mas as gravações de arquivos não são (especialmente se você não pode gravar todos os dados de uma só vez). Portanto, se você tem o padrão típico de produtor / consumidor (um processo produz arquivos, o outro observa um diretório e pega tudo o que encontra), primeiro grava em uma pasta temporária e depois move para o local real significa que o consumidor nunca poderá ver um arquivo inacabado.
  • Se o processo que grava o arquivo terminar na metade, você terá um arquivo quebrado no disco. Se estiver em um local real, você terá que cuidar de limpá-lo, mas se estiver em um local temporário, o sistema operacional cuidará disso.
  • Se o arquivo for criado enquanto uma tarefa de backup estiver em execução, a tarefa poderá pegar um arquivo incompleto; Os diretórios temporários geralmente são excluídos dos backups; portanto, o arquivo será incluído apenas uma vez movido para o destino final.
  • O diretório temp pode estar em um sistema de arquivos rápido, mas volátil (por exemplo, um ramdisk), o que pode ser benéfico para coisas como o download de vários pedaços do mesmo arquivo em paralelo ou o processamento no local do arquivo com muitas buscas. Além disso, os diretórios temporários tendem a causar mais fragmentação do que os diretórios com leituras, gravações e exclusões menos frequentes, e manter o diretório temporário em uma partição separada pode ajudar a manter a fragmentação das outras partições desativadas.

TL; DR - ele se resume principalmente à atomicidade, ou seja, você deseja torná-lo para que (no local final) o arquivo esteja completo ou não esteja em nenhum momento.

tdammers
fonte
12
Se o diretório temp estiver em uma partição separada, você perderá a atomicidade.
yfeldblum
16
Alguns programas extraem / copiam para o diretório desejado, mas usam uma extensão de arquivo temporária (por exemplo, .tmp) e a renomeiam quando concluída.
Dan Diplo
5
Às vezes, gravar em um arquivo temporário também é útil quando várias instâncias do seu programa podem tentar carregar o mesmo arquivo ao mesmo tempo, e você não pode confiar no sistema de arquivos para fornecer o nível de bloqueio correto (como API de armazenamento em nuvem mal definida) . O uso do arquivo temporário garantirá que o arquivo resultante não termine com uma mistura de dados de ambos os envios. Claro que isso é apenas mais um exemplo de atomicidade.
Krzysztof Kozielczyk
1
O caso de Dan Diplo é útil ao atualizar um arquivo existente. Você não deseja substituir o antigo até que o novo seja escrito com êxito, para que a gravação do novo não falhe ou algo mais leia o novo antes de ser totalmente escrito.
RalphChapin
1
Infelizmente, as pastas Temp do sistema operacional estão repletas de arquivos e pastas antigos porque o sistema operacional não a limpa! Portanto, como desenvolvedores, ainda devemos limpá-lo! superuser.com/questions/296824/…
markmnl 30/11
15

Esse parece ser um problema no Windows, mais especificamente relacionado a como o arrastar-soltar é gerenciado.

Os desenvolvedores do cliente WINSCP desenvolveram sua própria extensão de shell, que substitui esse comportamento de arrastar e soltar e permite soltar o arquivo na pasta correta imediatamente. Eles explicam o truque em sua documentação e, mais interessante, qual é o problema e como o resolveram.

Aqui está a parte interessante:

A mecânica de arrastar e soltar do Windows não permite que o aplicativo de origem da operação de arrastar e soltar descubra facilmente onde os arquivos são soltos. Cabe ao aplicativo de destino (geralmente Windows Explorer) transferir arquivos para o destino. É bastante razoável, porque o aplicativo de origem dificilmente pode transferir arquivos para todos os destinos possíveis. Lembre-se de que você pode soltar arquivos não apenas em um diretório, mas também em arquivos ZIP (ou qualquer outro arquivo morto), diretório remoto (via FTP, SFTP, SCP, ...), lixo, ...

Obviamente, mesmo o Windows Explorer (ou qualquer outro aplicativo de destino, como o WinZip) não pode baixar arquivos de qualquer fonte possível (particularmente ele não conhece SFTP / SCP).

Além disso, especificamente para o 7Zip: o usuário ray023 responde a esta pergunta nas perguntas e respostas da pilha do superusuário: https://superuser.com/a/422463

Basicamente, se, em vez de arrastar e soltar o arquivo, você usar o método "extrair aqui", disponível no 7-ZIP e no Winrar, os arquivos serão extraídos diretamente no diretório certo.

Jalayn
fonte
2
A pergunta não era "Por que o 7zip usa arquivos temporários?" A pergunta real era "Por que os arquivos temporários são comumente usados ​​no desenvolvimento de software?"
Phil
@ Phil O exemplo dado é, pelo que entendi, o que acontece quando você arrasta um arquivo de um arquivo para uma pasta no sistema, sem pedir explicitamente para "extraí-lo". No entanto, reli a pergunta e, sim, acho que você está certo, pois o autor queria saber mais sobre a utilidade das pastas temporárias, que por sinal foram habilmente respondidas por tdammers (+1 votado por mim também)
Jalayn
Enquanto a sua resposta não era exatamente o que eu estava procurando, +1, para resolver meu problema com 7zip
Devdatta Tengshe
1
Bom comentário basicamente se resume a: por que um programa usa uma pasta temporária? Como ao arrastar e soltar, ela não conhece a pasta de destino e apenas "entrega" para o Windows, o Windows assume o controle e coloca o arquivo no lugar certo.
Pieter B
0

Se você precisar fazer algum tipo de processamento de dados no arquivo (decodificar / converter / etc.), é melhor usar um arquivo temporário e, quando concluído, e somente se concluído, transferir o resultado para o destino final.

Benefícios:

  1. Somente arquivos concluídos atingem o destino
  2. O arquivo temporário pode (deve) residir em mídia rápida
  3. Evitar fragmentação no arquivo final
  4. Permite o uso de outras mídias como destino final (ftp, nuvem, qualquer que seja)
  5. Arquivos temporários interrompidos são mais fáceis de limpar

Não vejo benefícios reais de escrever diretamente no destino durante o processamento dos dados.

roetnig
fonte