¿Por qué 7-zip / WinRAR descomprime archivos en "temp" antes de moverlos a su destino?

50

¿Por qué 7-zip / WinRAR descomprime archivos en "temp" antes de moverlos a su destino?

No veo ninguna ventaja contra simplemente descomprimir directamente al destino. Es realmente irritante, especialmente para archivos grandes (¡como lo es ahora!).


Editar:

Por favor explique por qué no se hacen en su lugar .

Stevoisiak
fuente
3
Si especifica `` como la carpeta temporal en WinRAR, debería extraerse directamente al destino.

Respuestas:

82

¿Cómo exactamente extraes los archivos? ¿Estás utilizando la línea de comandos o la GUI? ¿Está arrastrando los archivos o seleccionándolos y utilizando la función de extracción? ¿Está utilizando el menú contextual de la extensión de shell?

Si ingresa una carpeta de destino y luego selecciona la función de extracción o utiliza la extensión de shell, entonces no se extraen primero a una carpeta temporal, sino que se extraen directamente al destino.

Si selecciona los archivos de la interfaz de usuario y arrastra a la carpeta de destino, entonces se va a extraer en una carpeta temporal.

La razón está en cómo se selecciona el destino. Si ingresa a la carpeta de destino o utiliza el elemento del menú contextual, el programa sabrá exactamente dónde debe extraerlo. Sin embargo, si simplemente arrastra los archivos, debido a cómo funciona la función de arrastrar y soltar de OLE , el programa no sabe dónde está la carpeta de destino. En otras palabras, es Explorerque recibe la carpeta de destino, no el programa de archivo. Como resultado, el programa no puede saber dónde extraerlos, por lo que simplemente los extrae a la carpeta temporal, luego Explorer los mueve una vez hecho. Puede ver esto claramente extrayendo un archivo grande utilizando ambos métodos. Cuando lo arrastra a una carpeta, se extrae, luego ve el cuadro de diálogo de operación de archivos estándar de Explorer moviéndolo a la carpeta. Si especifica la carpeta y hace clic en Extraer, se extrae y no se realiza ningún procesamiento adicional.

Siéntase libre de leer el código fuente de 7-Zip para ver cómo se maneja la ubicación de extracción.


Aprendí esto de la manera difícil hace varios años cuando quería implementar arrastrar y soltar en un programa que estaba escribiendo.

Synetech
fuente
77
Absolutamente brillante, ¡gracias por esto! Esto me ha aturdido durante años, pero nunca me he tomado el tiempo para rastrear el "qué" y el por qué ". En los extraños momentos en que encuentro mi carpeta C: temp llena en el whazoo, busco las opciones de Winrar para encontrar dónde está. debe configurarse para extraer primero a una carpeta temporal en C:. Pero, por desgracia, no lo encuentro. Nunca conecté la correlación entre los dos métodos, y ahora aprecio ver la luz :) ¡Gracias!
Coldblackice
2
Una cosa que está mal aquí es que Explorer no mueve el archivo, sino que lo copia . Lo cual es realmente irritante porque moverse es muy rápido (excepto cuando se mueve de una partición a otra) y debería haber sido la opción ideal (no desperdicia espacio), pero los idiotas de Microsoft pensaron que es una gran idea copiar de la carpeta temporal luego simplemente deje los datos de la carpeta temporal por ahí. ¡No solo la extracción de un archivo enorme ocupará el doble del espacio, sino que también tomará casi el doble de tiempo!
ADTC
Probablemente tenían una buena razón para eso, y puede deberse a algún tipo de limitación de los sistemas y / o DDE en los que se basó, cuando diseñaron OLE por primera vez, en los días de Windows 3; una limitación que puede o no aplicarse hoy.
Synetech
1
Sí, es ridículo, especialmente en una máquina virtual con espacio limitado. El uso de "extraer para" descomprime un archivo RAR de 8GB con más de 6000 archivos en aproximadamente 1 minuto. Sin embargo, si arrastra las carpetas, lleva la misma cantidad de tiempo descomprimir a un directorio temporal, pero además, congela la ventana de destino y luego COPIA los archivos durante más de 15 minutos a solo 3 mb / s. Es especialmente lento copiar un archivo en la misma unidad (posiblemente debido al sistema de archivos virtual subyacente), aunque puedo copiar un archivo de otra máquina virtual en esta máquina a través de la red a cientos de MB / s.
Triynko
1
Supongo que una posible solución sería crear un archivo de 0 bytes con un nombre GUID, es decir, prácticamente improbable que ocurra como un nombre de archivo duplicado. Luego, controle los identificadores del archivo explorer.exe para ver dónde copia el archivo. Finalmente extraer el archivo al destino.
Zv_oDD
1

Se hace para que los requisitos de memoria para la descompresión se mantengan al mínimo.

Si no usaran el sistema de archivos, la descompresión ocurriría en la memoria. En condiciones de poca memoria, o para archivos comprimidos grandes, tarde o temprano agotaría la memoria disponible y comenzaría el proceso de paginación de memoria.

La paginación en estas circunstancias sería mucho más lenta que simplemente usar el sistema de archivos porque el archivo todavía se está descomprimiendo (y los archivos de página se siguen agregando), pero también porque a medida que el archivo se descomprime, se comprueba si hay errores y existe como tal muchas operaciones de lectura / escritura. Lo peor que le puede pasar a un archivo de página.

EDITAR: Con respecto al uso de un directorio temporal, es necesario seguir muchas pautas del sistema operativo. Si la descompresión falla, no hay garantía de que el programa que realiza la operación se limpie después de sí mismo. Puede haber fallado por ejemplo. Como tal, no queda ningún archivo residual en su directorio de destino y el sistema operativo eliminará el archivo temporal cuando lo considere apropiado.

Un enano
fuente
3
Si bien es cierto, eso no explica por qué los archivos se comprimen primero en un directorio temporal y luego se mueven al destino. La operación también podría tener lugar allí mismo.
slhck
3
Editado para reflejar mejor su pregunta
Un enano
44
@Dante, eso no es cierto. Mover un archivo en la misma partición simplemente cambia el índice del archivo en el sistema de archivos al nuevo directorio, no copia ningún dato y solo toma un instante. No me creas Pruébelo, corte un archivo de varios GB de una carpeta y péguelo en otra carpeta; Tarda menos de un segundo. Intentan lo mismo con otra unidad o partición. Toma minutos
Dour High Arch
3
Re "el sistema operativo eliminará el archivo temporal cuando lo considere apropiado": ¿Windows lo hace alguna vez ?
Grawity
1
Esta respuesta completamente falsa debe eliminarse. 7zip solo se descomprime en una carpeta temporal durante las operaciones de arrastrar y soltar, y esto se debe a las limitaciones de Windows. Visite superuser.com/questions/197961/… para obtener más información.
dss539
-1

La razón es más simple de lo que piensas: muchos programas descomprimen archivos en% temp%, es que el sistema de archivos de destino podría no tener suficiente espacio.

Ahora, puede saber que su sistema de archivos puede tener suficiente espacio, sin embargo, la aplicación no lo tiene. ¿Qué pasa si ese sistema de archivos está en uso por el sistema operativo u otra aplicación y se llena mientras se descomprime?

Los desarrolladores suponen que% temp% tiene espacio "ilimitado", mientras que su destino no.

Keltari
fuente
No exactamente; esa no es una razón para usar el directorio temporal. La aplicación sabe (o al menos puede) saber si hay suficiente espacio o no. Primero, el archivador sabe exactamente qué tan grandes son los archivos comprimidos cuando se descomprimen y puede asignarlos de antemano, y luego completarlos a medida que se descomprime, y en segundo lugar, es bastante simple consultar el espacio libre en una unidad. Además, si no hay suficiente espacio, simplemente se descomprime mientras puede, y arroja un error cuando se queda sin espacio.
Synetech
En realidad, esta es una buena respuesta. El hecho de que una aplicación pueda preasignar el espacio en el destino de destino, no significa que tendrá acceso exclusivo a ella. La aplicación puede consultar el destino y ver si tiene suficiente espacio, pero mientras se realiza esa consulta, antes de poder asignar espacio, otra aplicación puede ocupar parte de ese espacio.
Keltari
Además de eso, el espacio temporal de un usuario está vinculado a ese usuario en el nivel del sistema de archivos. Si hubo un bloqueo u otra falla, otro usuario no pudo ver los archivos temporales. Es posible que el destino no tenga tales restricciones de seguridad, por lo que es más seguro no tener datos posiblemente confidenciales en otro sistema de archivos.
Keltari
Como dije, si se agota mientras se descomprime, simplemente da un mensaje de error. ¿Cómo se solucionaría la extracción a una unidad temporal? Si no hay suficiente espacio, entonces no hay suficiente espacio después de que los archivos se extraen a la unidad temporal, y desperdicia todos esos ciclos de CPU y las lecturas / escrituras de la unidad se extraen en la unidad temporal por nada. Como dije en mi respuesta, siéntase libre de leer el código fuente de 7-Zip, o póngase en contacto con Alexander Roshal para preguntarle sobre WinRAR. Además, como también dije, si especifica el objetivo o usa el menú contextual, no usa% temp%.
Synetech
-2

No siendo un desarrollador de 7-zip o WinRAR, mis comentarios aquí son puramente especulativos. Dicho esto, usar el espacio temporal para descomprimir hasta que todo esté completo ayuda a verificar que todos los archivos estén intactos (es decir, que el archivo zip no está dañado).

No hay nada peor que desempaquetar un archivo comprimido grande, haber comenzado a trabajar en archivos al comienzo del archivo; solo para descubrir que algo está dañado al final del archivo. En ese punto, pierdes la confianza en todo.

Mi último comentario es que no recuerdo haber visto este comportamiento en 7-zip. Cuando hago clic derecho y digo extraer aquí, generalmente tengo acceso a los archivos a medida que se descomprimen. ¿Has comprobado que no es un escenario en alguna parte?

Iglesia
fuente
3er párrafo: No puedo encontrar esa configuración, y es un gran grupo de archivos (4G) que estaba extrayendo en este momento, estoy bastante seguro de que finalmente 4G se movió lentamente.
2º párrafo: extraer a "temp" no impide nada si el archivo comprimido ya está dañado.
Le impide ver archivos de un zip dañado. La lógica es que no puedes ver nada hasta que todo esté verificado. En cuanto a la configuración, no estoy seguro de qué decirle. Si le digo a 7-zip que extraiga un archivo tar grande en mi escritorio, empiezo a ver los archivos de inmediato. Podría ser porque tar no es un formato comprimido.
Kirk
> La lógica es que no puedes ver nada hasta que todo esté verificado. Eso es absurdo. ¿Cómo recuperarías algunos archivos de un archivo corrupto? La razón por la que no lo experimenta es porque usó la extensión de shell en lugar de arrastrar los archivos desde la GUI.
Synetech