¿Cuál es el beneficio de escribir en una ubicación temporal y luego copiarlo en el destino previsto?

48

Estoy escribiendo una aplicación que funciona con imágenes satelitales, y mi jefe me pidió que mirara algunas de las aplicaciones comerciales y ver cómo se comportan. Encontré un comportamiento extraño y luego, mientras lo buscaba, también lo encontré en otras aplicaciones estándar.

Estos programas primero escriben en la carpeta temporal y luego la copian en el destino deseado.

Ejemplo: 7zip primero extrae en la carpeta temporal, y luego copia los datos extraídos a la ubicación en la que le había pedido que extraiga los datos.

Veo varios problemas con este enfoque:

  1. Es posible que la carpeta temporal no tenga suficiente espacio, mientras que la ubicación prevista podría tener tanto espacio.

  2. Si se trata de un archivo grande, la operación de copia puede llevar un tiempo no despreciable.

Lo pensé mucho, pero no pude ver un solo punto positivo para hacer esto. ¿Me estoy perdiendo algo o hay un beneficio real al hacerlo?

Devdatta Tengshe
fuente
Si la aplicación lo requiere, hazlo. De lo contrario, haz lo que tenga sentido. Tu cerebro te dice que no es necesario en este caso. Estoy en el campo de hacer la menor cantidad de trabajo posible, como puede ver en mi respuesta, así que recomiendo hacer la menor cantidad de trabajo posible para la aplicación.
Jason Sebring
1
¿Está seguro de que está "copiando" el archivo y no "moviéndolo"? Gran diferencia.
frankc
Desde blogs.rsa.com/… , para malwares, la ventaja es 1) La escritura garantizada evita la detección de "errores rojos" incluso antes de que haya descargado completamente el virus en la computadora del usuario 2) Los discos TEMP son generalmente más rápidos (RAMDisk) reduciendo el tiempo para detección mientras el virus todavía está en la etapa de descarga (una vez que el virus está completamente formado y se las arregló para ejecutarse durante 0.05 segundos, el juego terminó, así que es una carrera de tiempo)
Pacerier
3) Mientras todavía está descargando o ejecutando, si un antivirus se estrelló contra usted (a veces sin saberlo) y dejó sus huesos por ahí, aún puede contar con un x% de posibilidades de que el sistema operativo o el usuario lo ayuden accidentalmente a eliminar sus huesos muertos, mientras están borrando a granel cosas de la carpeta TEMP, esto ayuda a reducir la probabilidad de detección.
Pacerier

Respuestas:

96

Algunas razones que se me ocurren:

  • En la mayoría de las plataformas, los movimientos de archivos son atómicos, pero las escrituras de archivos no lo son (especialmente si no puede escribir todos los datos de una vez). Entonces, si tiene el patrón típico de productor / consumidor (un proceso produce archivos, el otro mira un directorio y recoge todo lo que encuentra), escribir primero en una carpeta temporal y solo luego moverse a la ubicación real significa que el consumidor nunca puede ver un Archivo inacabado.
  • Si el proceso que escribe el archivo termina a la mitad, tiene un archivo roto en su disco. Si está en una ubicación real, debe encargarse de limpiarlo usted mismo, pero si está en una ubicación temporal, el sistema operativo se encargará de ello.
  • Si el archivo se crea mientras se está ejecutando un trabajo de respaldo, el trabajo puede recoger un archivo incompleto; Los directorios temporales generalmente se excluyen de las copias de seguridad, por lo que el archivo solo se incluirá una vez que se haya movido al destino final.
  • El directorio temporal puede estar en un sistema de archivos rápido pero volátil (por ejemplo, un disco ram), lo que puede ser beneficioso para cosas como descargar varios fragmentos del mismo archivo en paralelo o realizar un procesamiento en el lugar en el archivo con muchas búsquedas. Además, los directorios temporales tienden a causar más fragmentación que los directorios con lecturas, escrituras y eliminaciones menos frecuentes, y mantener el directorio temporal en una partición separada puede ayudar a mantener baja la fragmentación de las otras particiones.

TL; DR: se reduce principalmente a la atomicidad, es decir, desea hacerlo para que (en la ubicación final) el archivo esté completo o no esté allí en ningún momento dado.

tdammers
fuente
12
Si el directorio temporal está en una partición separada, pierde la atomicidad.
yfeldblum
16
Algunos programas extraerán / copiarán al directorio deseado, pero utilizarán una extensión de archivo temporal (por ejemplo, .tmp) y la cambiarán de nombre cuando se complete.
Dan Diplo
55
En ocasiones, escribir en un archivo temporal también es útil cuando varias instancias de su programa podrían intentar cargar el mismo archivo al mismo tiempo, y no puede confiar en el sistema de archivos para proporcionar el nivel de bloqueo correcto (como API de almacenamiento en la nube mal definida) . El uso del archivo temporal asegurará que el archivo resultante no termine con una mezcla de datos de ambas cargas. Por supuesto, esta es solo otra instancia de atomicidad.
Krzysztof Kozielczyk
1
El caso de Dan Diplo es útil al actualizar un archivo existente. No desea reemplazar el antiguo hasta que el nuevo se haya escrito correctamente, para que la escritura del nuevo falle o algo más lea el nuevo antes de que esté completamente escrito.
RalphChapin
1
Desafortunadamente, aunque las carpetas OS Temp están plagadas de archivos y carpetas viejos porque el sistema operativo no lo limpia. ¡Así que nosotros como desarrolladores aún deberíamos limpiarlo! superuser.com/questions/296824/...
markmnl
15

Esto parece ser un problema en Windows, más específicamente relacionado con la forma en que se gestiona la operación de arrastrar y soltar.

Los desarrolladores del cliente WINSCP han desarrollado su propia extensión de shell, que anula este comportamiento de arrastrar y soltar y permite colocar el archivo en la carpeta correcta de inmediato. Explican el truco en su documentación y, más interesante, cuál es el problema y cómo lo resolvieron.

Esta es la parte interesante:

La mecánica de arrastrar y soltar de Windows no permite que la aplicación de origen de la operación de arrastrar y soltar descubra fácilmente dónde se sueltan los archivos. Depende de la aplicación de destino (generalmente el Explorador de Windows) transferir archivos al destino. Es bastante razonable, porque la aplicación de origen difícilmente puede transferir archivos a todos los destinos posibles. Tenga en cuenta que puede colocar archivos no solo en un directorio, sino incluso en un archivo ZIP (o cualquier otro archivo), directorio remoto (a través de FTP, SFTP, SCP, ...), basura, ...

Obviamente, incluso el Explorador de Windows (o cualquier otra aplicación de destino, como WinZip) no puede descargar archivos de ninguna fuente posible (particularmente no conoce SFTP / SCP).

Además, específicamente para 7Zip: el usuario ray023 responde a esta pregunta en las Preguntas y respuestas de SuperUser Stack: https://superuser.com/a/422463

Básicamente, si en lugar de arrastrar y soltar su archivo utiliza el método "extraer aquí" disponible en 7-ZIP y Winrar, los archivos se encuentran directamente en el directorio correcto.

Jalayn
fuente
2
La pregunta no era "¿Por qué 7zip usa archivos temporales?" La pregunta real era "¿Por qué los archivos temporales se usan comúnmente en el desarrollo de software?"
Phil
@Phil El ejemplo dado es, por lo que entiendo, lo que sucede cuando arrastra un archivo de un archivo a una carpeta en el sistema, sin pedir explícitamente "extraerlo". Sin embargo, releí la pregunta, y sí, creo que tiene razón en que el autor quería saber más sobre la utilidad de las carpetas temporales, que por cierto fue respondida magistralmente por tdammers (+1 también votó por mí)
Jalayn
Si bien su respuesta no era exactamente lo que estaba buscando, +1, para resolver mi problema con 7zip
Devdatta Tengshe
1
Un buen comentario básicamente se reduce a: ¿por qué un programa usa una carpeta temporal? Porque cuando arrastra y suelta no conoce la carpeta de destino y simplemente "la da" a Windows, entonces Windows se hace cargo y coloca el archivo en el lugar correcto.
Pieter B
0

Si tiene que hacer algún tipo de procesamiento de datos en el archivo (decodificar / convertir / etc.), entonces es mejor usar un archivo temporal y cuando se complete, y solo si se completa, transferir el resultado al destino final.

Beneficios:

  1. Solo los archivos completos llegan al destino
  2. El archivo temporal puede (debería) residir en medios rápidos
  3. Evite la fragmentación en el archivo final
  4. Permite el uso de otros medios como destino final (ftp, nube, lo que sea)
  5. Los archivos temporales anulados son más fáciles de limpiar

No veo beneficios reales de escribir directamente al destino mientras proceso los datos.

roetnig
fuente