Por que o 7-zip / WinRAR descompacta os arquivos em "temp" antes de movê-los para o destino?

50

Por que o 7-zip / WinRAR descompacta os arquivos em "temp" antes de movê-los para o destino?

Não vejo nenhuma vantagem em apenas descompactar diretamente para o destino. É realmente irritante, especialmente para arquivos grandes (como é agora!).


Editar:

Por favor, explique por que eles não são feitos no local .

Stevoisiak
fonte
3
Se você especificar `` como a pasta temporária no WinRAR, ela deverá ser extraída diretamente para o destino.

Respostas:

82

Como exatamente você está extraindo os arquivos? Você está usando a linha de comando ou a GUI? Você está arrastando os arquivos ou selecionando-os e usando a função extrair? Você está usando o menu de contexto da extensão do shell?

Se você inserir uma pasta de destino e selecionar a função de extração ou usar a extensão de shell, elas não serão extraídas para uma pasta temporária primeiro, elas serão extraídas diretamente para o destino.

Se você selecionar os arquivos na interface do usuário e arrastá- los para a pasta de destino, ele será extraído para uma pasta temporária.

O motivo está em como o destino é selecionado. Se você inserir a pasta de destino ou usar o item do menu de contexto, o programa saberá exatamente para onde precisa extrair. No entanto, se você simplesmente arrastar os arquivos, devido ao funcionamento da função de arrastar e soltar do OLE , o programa não saberá onde está a pasta de destino. Em outras palavras, é Explorerque recebe a pasta de destino, não o programa de arquivamento. Como resultado, o programa não pode saber onde extraí-los e, portanto, simplesmente extrai-os para a pasta temp, e o Explorer os move assim que terminar. Você pode ver isso claramente extraindo um arquivo grande usando os dois métodos. Quando você o arrasta para uma pasta, ele é extraído e você vê a caixa de diálogo de operação de arquivo padrão do Explorer movendo-o para a pasta. Se você especificar a pasta e clicar em Extrair, ela será extraída e nenhum processamento adicional será feito.

Fique à vontade para ler o código-fonte do 7-Zip para ver como o local de extração é tratado.


Aprendi isso da maneira mais difícil, há vários anos, quando queria implementar o recurso de arrastar e soltar em um programa que estava escrevendo.

Synetech
fonte
7
Absolutamente brilhante - obrigado por isso! Isso me incomodou por anos, mas eu nunca tive tempo para rastrear o "o quê" e o porquê ". Nas vezes em que encontro minha pasta C: temp cheia no whazoo, vasculho as opções do Winrar para descobrir onde deve ser definido para primeiro extrair para uma pasta temporária em C :. Mas, infelizmente, não a encontrei.Eu nunca conectei a correlação entre os dois métodos e agora aprecio ver a luz :) Obrigado!
Coldblackice
2
Uma coisa errada aqui é que o Explorer não move o arquivo, mas o copia . O que é realmente irritante porque mover é muito rápido (exceto ao mover de uma partição para outra) e deveria ter sido a escolha ideal (não desperdiça espaço), mas os idiotas da Microsoft acharam uma ótima idéia copiar da pasta temporária então deixe os dados da pasta temporária por aí. A extração de um grande arquivo não só ocupará o dobro do espaço, mas também levará quase o dobro do tempo!
ADTC
Eles provavelmente tinham um bom motivo para isso, e isso pode ter sido devido a algum tipo de limitação de sistemas e / ou DDE em que se baseava, quando eles criaram o OLE, nos dias do Windows 3; uma limitação que pode ou não ser aplicada hoje.
Synetech
1
Sim, é ridículo, especialmente em uma máquina virtual com espaço limitado. O uso de "extrair para" descompacta um arquivo RAR de 8 GB com mais de 6000 arquivos em aproximadamente 1 minuto. No entanto, se você arrastar as pastas, leva o mesmo tempo para descompactar para um diretório temporário, mas, além disso, congela a janela de destino e copia os arquivos por mais de 15 minutos a apenas 3mb / s. É especialmente lento copiar um arquivo na mesma unidade (possivelmente devido ao sistema de arquivos virtual subjacente), mesmo que eu possa copiar um arquivo de outra máquina virtual para esta máquina pela rede a centenas de MB / s.
Triynko
1
Eu acho que uma possível solução seria criar um arquivo de 0 byte com um nome GUID, ou seja, praticamente improvável que ocorra como um nome de arquivo duplicado. Em seguida, monitore os identificadores de arquivo do explorer.exe para ver onde ele copia o arquivo. Por fim, extraia o arquivo morto para o destino.
Zv_oDD
1

Isso é feito para que os requisitos de memória para descompactação sejam mantidos no mínimo.

Se eles não usassem o sistema de arquivos, a descompressão aconteceria na memória. Sob condições de pouca memória, ou para arquivos compactados grandes, isso esgotaria mais cedo ou mais tarde a memória disponível e iniciaria o processo de paginação da memória.

A paginação nessas circunstâncias seria muito mais lenta do que apenas usar o sistema de arquivos, porque o arquivo ainda está sendo descompactado (e os arquivos de paginação continuam sendo adicionados), mas também porque, como o arquivo está sendo descompactado, ele está sendo verificado quanto a erros e, como tal, muitas operações de leitura / gravação. A pior coisa que pode acontecer com um arquivo de paginação.

EDIT: No que diz respeito ao uso de um diretório temporário, siga as orientações do sistema operacional. Se a descompressão falhar, não há garantia de que o programa que executa a operação se limpa. Pode ter travado, por exemplo. Como tal, nenhum arquivo residual permanece no diretório de destino e o sistema operacional descartará o arquivo temporário quando achar apropriado.

Um anão
fonte
3
Embora verdadeiro, isso não explica por que os arquivos são compactados primeiro em um diretório temporário e depois movidos para o diretório de destino. A operação também pode estar ocorrendo ali.
slhck
3
Editado para refletir melhor sua pergunta
A Dwarf
4
@ Dante, isso não é verdade. Mover um arquivo na mesma partição simplesmente altera o índice do arquivo no sistema de arquivos para o novo diretório, ele não copia nenhum dado e leva apenas um instante. Não acredita em mim? Experimente, corte um arquivo com vários GB de uma pasta e cole-o em outra pasta; leva menos de um segundo. Eles tentam a mesma coisa em outra unidade ou partição. Leva alguns minutos.
Dour High Arch
3
Re "o sistema operacional descartará o arquivo temporário quando achar apropriado": O Windows faz isso?
grawity
1
Essa resposta completamente falsa deve ser removida. O 7zip descompacta apenas em uma pasta temporária durante as operações de arrastar e soltar e isso ocorre devido às limitações do Windows. Consulte superuser.com/questions/197961/… para obter mais informações.
dss539
-1

O motivo é mais simples do que você pensa: Muitos programas descompactam arquivos para% temp%, é que o sistema de arquivos de destino pode não ter espaço suficiente.

Agora, você pode saber que seu sistema de arquivos pode ter espaço suficiente, mas o aplicativo não. E se esse sistema de arquivos estiver em uso pelo sistema operacional ou outro aplicativo e for preenchido durante a descompactação?

Os desenvolvedores assumem que% temp% possui espaço "ilimitado", enquanto o seu destino não.

Keltari
fonte
Não é bem assim; esse não é um motivo para usar o diretório temporário. O aplicativo sabe (ou pelo menos pode) saber se há espaço suficiente ou não. Primeiro, o arquivador sabe exatamente o tamanho dos arquivos compactados quando são descompactados e pode alocá-los com antecedência, preenchendo-os à medida que descompacta e, segundo, é bastante simples consultar o espaço livre em uma unidade. Além disso, se não houver espaço suficiente, ele simplesmente se descompacta enquanto pode e, em seguida, gera um erro quando fica sem espaço.
Synetech 27/08/11
Na verdade, essa é a resposta. Só porque um aplicativo pode pré-alocar o espaço no destino de destino, não significa que ele terá acesso exclusivo a ele. O aplicativo pode consultar o destino e verificar se há espaço suficiente, mas enquanto essa consulta está ocorrendo, antes de poder alocar espaço, outro aplicativo pode ocupar um pouco desse espaço.
Keltari
Além disso, o espaço temporário do usuário está vinculado a esse usuário no nível do sistema de arquivos. Se houve uma falha ou outra falha, outro usuário não pôde ver os arquivos temporários. O destino pode não ter essas restrições de segurança, portanto, é mais seguro não ter dados confidenciais pendurados em outro sistema de arquivos.
Keltari
Como eu disse, se acabar durante a descompactação, simplesmente enviará uma mensagem de erro. Como a extração para uma unidade temporária corrigia isso? Se não houver espaço suficiente, não haverá espaço suficiente após os arquivos serem extraídos para a unidade temporária, e desperdiçará todos esses ciclos da CPU e as leituras / gravações da unidade serão extraídas para a unidade temporária à toa. Como eu disse na minha resposta, fique à vontade para ler o código-fonte do 7-Zip ou entre em contato com Alexander Roshal para perguntar sobre o WinRAR. Além disso, como eu também disse, se você especificar o destino ou usar o menu de contexto, ele não usará% temp%.
precisa saber é o seguinte
-2

Não sendo um desenvolvedor de 7 zip ou WinRAR, meus comentários aqui são pura especulação. Dito isto, usar o espaço temporário para descompactar até que tudo esteja completo ajuda a verificar se todos os arquivos estão intactos (ou seja, se o zip não está corrompido).

Não há nada pior do que descompactar um arquivo compactado grande, tendo começado a trabalhar nos arquivos no início do arquivo; apenas para descobrir que algo está corrompido no final do arquivo. Nesse ponto, você perde a confiança em tudo.

Meu último comentário é que não me lembro de ter visto esse comportamento do 7-zip. Quando clico com o botão direito do mouse e digo extrair aqui, geralmente tenho acesso aos arquivos enquanto eles estão sendo descompactados. Você verificou se não é uma configuração em algum lugar?

Kirk
fonte
Parágrafo 3º: Não consigo encontrar essas configurações, e é um monte de arquivos (4G) que eu estava extraindo agora, tenho certeza de que todo o 4G foi movido lentamente, finalmente.
Segundo parágrafo: extrair para "temp" não impede nada se o arquivo compactado já estiver corrompido.
Impede que você veja arquivos fora de um zip corrompido. A lógica é que você não consegue ver nada até que tudo seja verificado. Quanto à definição, não sei o que dizer. Se eu disser ao 7-zip para extrair um arquivo tar grande para minha área de trabalho, começo a ver os arquivos imediatamente. Pode ser porque o tar não é um formato compactado.
Kirk
> A lógica é que você não consegue ver nada até que tudo seja verificado. Isso é um absurdo. Como você recuperaria alguns arquivos de um arquivo corrompido? A razão pela qual você não experimenta isso é porque você usou a extensão do shell em vez de arrastar os arquivos da GUI.
Synetech 27/08