Qual è il vantaggio di scrivere in una posizione temporanea e quindi di copiarlo nella destinazione prevista?


48

Sto scrivendo un'applicazione che funziona con le immagini satellitari e il mio capo mi ha chiesto di esaminare alcune delle applicazioni commerciali e vedere come si comportano. Ho trovato un comportamento strano e poi mentre lo guardavo, l'ho trovato anche in altre applicazioni standard.

Questi programmi prima scrivono nella cartella temporanea, quindi la copiano nella destinazione desiderata.

Esempio: 7zip estrae prima nella cartella temporanea, quindi copia i dati estratti nella posizione in cui era stato chiesto di estrarre i dati.

Vedo diversi problemi con questo approccio:

  1. La cartella temporanea potrebbe non avere abbastanza spazio, mentre la posizione prevista potrebbe avere così tanto spazio.

  2. Se si tratta di un file di grandi dimensioni, l'operazione di copia può richiedere un tempo non trascurabile.

Ci ho pensato molto, ma non riuscivo a vedere un solo punto positivo per farlo. Mi sto perdendo qualcosa o c'è un vero vantaggio nel fare questo?


Se l'applicazione lo richiede, fallo. Altrimenti, fai ciò che ha senso. Il tuo cervello ti sta dicendo che non è necessario in questo caso. Sono nel campo di fare il minor lavoro possibile, come puoi vedere dalla mia risposta, quindi ti consiglio di fare il minor lavoro possibile per l'app.
Jason Sebring,

1
Sei sicuro che stia "copiando" il file e non "spostandolo"? Grande differenza.
Frank

Da blogs.rsa.com/… , per malware, il vantaggio è 1) La scrivibilità garantita evita il rilevamento di "errori rossi" prima ancora di aver scaricato completamente il virus sul computer dell'utente 2) I dischi TEMP sono in genere più veloci (RAMDisk) riducendo il tempo per rilevamento mentre il virus è ancora in fase di download (una volta che il virus è completamente formato e riesce a eseguirsi per 0,05 secondi, il gioco è finito, quindi è una corsa del tempo)
Pacerier

3) Mentre stai ancora scaricando o eseguendo, se un antivirus si è schiantato su di te (se stesso senza saperlo, a volte) e ha lasciato le ossa in giro, puoi comunque contare su una probabilità del x% che il sistema operativo o l'utente ti aiuterebbe accidentalmente a eliminare le tue ossa morte, mentre stanno eliminando gli oggetti dalla cartella TEMP, questo aiuta a ridurre la probabilità di rilevamento.
Pacerier,

Risposte:


96

Alcuni motivi a cui posso pensare:

  • Sulla maggior parte delle piattaforme, gli spostamenti dei file sono atomici, ma non lo sono le scritture di file (soprattutto se non è possibile scrivere tutti i dati in una volta sola). Quindi se hai il tipico modello produttore / consumatore (un processo produce file, l'altro controlla una directory e raccoglie tutto ciò che trova), scrivere prima in una cartella temporanea e solo successivamente spostarsi nella posizione reale significa che il consumatore non può mai vedere un file incompiuto.
  • Se il processo che scrive il file si interrompe a metà, hai un file rotto sul tuo disco. Se si trova in una posizione reale, devi occuparti di ripulirlo da solo, ma se si trova in una posizione temporanea, il sistema operativo se ne occuperà.
  • Se il file viene creato durante l'esecuzione di un processo di backup, è possibile che il processo raccolga un file incompleto; le directory temporanee sono generalmente escluse dai backup, quindi il file verrà incluso solo una volta spostato nella destinazione finale.
  • La directory temporanea può trovarsi su un filesystem veloce ma volatile (ad es. Un ramdisk), che può essere utile per cose come il download di più blocchi dello stesso file in parallelo o l'elaborazione sul posto del file con molte ricerche. Inoltre, le directory temporanee tendono a causare una maggiore frammentazione rispetto alle directory con letture, scritture ed eliminazioni meno frequenti e mantenere la directory temporanea su una partizione separata può aiutare a mantenere bassa la frammentazione delle altre partizioni.

TL; DR: si riduce per lo più all'atomicità, cioè si vuole farlo in modo che (nella posizione finale) il file sia completo o non ci sia affatto in un dato momento.


12
Se la directory temporanea si trova su una partizione separata, si perde l'atomicità.
yfeldblum,

16
Alcuni programmi estrarranno / copieranno nella directory desiderata, ma useranno un'estensione di file temporanea (ad esempio .tmp) e la rinomineranno al termine.
Dan Diplo,

5
A volte la scrittura su un file temporaneo è utile anche quando diverse istanze del programma potrebbero tentare di caricare lo stesso file contemporaneamente e non è possibile fare affidamento sul file system per fornire il giusto livello di blocco (come l'API di archiviazione cloud scarsamente definita) . L'uso del file temporaneo farà in modo che il file risultante non finisca con un mix di dati di entrambi i caricamenti. Naturalmente questo è solo un altro esempio di atomicità.
Krzysztof Kozielczyk,

1
Il caso di Dan Diplo è utile quando si aggiorna un file esistente. Non vuoi sostituire quello vecchio fino a quando quello nuovo non è stato scritto con successo, per evitare che la scrittura del nuovo fallisca o qualcos'altro legga quello nuovo prima che sia completamente scritto.
RalphChapin,

1
Purtroppo, però, le cartelle temporanee del sistema operativo sono piene di vecchi file e cartelle perché il sistema operativo non lo pulisce! Quindi noi sviluppatori dovremmo ancora ripulirlo! superuser.com/questions/296824/…
markmnl

15

Questo sembra essere un problema in Windows, più specificamente correlato alla gestione del trascinamento della selezione.

Gli sviluppatori del client WINSCP hanno sviluppato la propria estensione shell, che sostituisce questo comportamento di trascinamento della selezione e consente di rilasciare immediatamente il file nella cartella corretta. Spiegano il trucco nella loro documentazione e, più interessante, qual è il problema e come lo hanno risolto.

Ecco la parte interessante:

La meccanica di trascinamento della selezione di Windows non consente all'applicazione di origine dell'operazione di trascinamento della selezione di scoprire facilmente dove vengono rilasciati i file. Spetta all'applicazione di destinazione (Windows Explorer di solito) trasferire i file a destinazione. È piuttosto ragionevole, perché l'applicazione di origine difficilmente può trasferire file a tutte le possibili destinazioni. Tieni presente che puoi eliminare i file non solo in una directory, ma anche in un file ZIP (o in qualsiasi altro archivio), directory remota (tramite FTP, SFTP, SCP, ...), cestino, ...

Ovviamente anche Windows Explorer (o qualsiasi altra applicazione di destinazione, come WinZip) non può scaricare file da alcuna fonte possibile (in particolare non conosce SFTP / SCP).

Inoltre, in particolare per 7Zip: l'utente ray023 risponde a questa domanda in Domande e risposte sullo stack di SuperUser: https://superuser.com/a/422463

Fondamentalmente, se invece di trascinare il file usando il metodo "Estrai qui" disponibile in 7-ZIP e Winrar, i file sono direttamente nella directory giusta.


2
La domanda non era "Perché 7zip usa i file temporanei?" La vera domanda era "Perché i file temporanei sono comunemente usati nello sviluppo del software?"
Phil

@Phil L'esempio fornito è, da quello che ho capito, cosa succede quando trascini un file da un archivio in una cartella sul sistema, senza chiedere esplicitamente di "estrarlo". Tuttavia, rileggo la domanda, e sì, penso che tu abbia ragione nel dire che l'autore voleva saperne di più sull'utilità delle cartelle temporanee, che tra l'altro ha magistralmente risposto ai tdammer (+1 votato anche da me)
Jalayn,

Mentre la tua risposta non era esattamente quello che stavo cercando, +1, per aver risolto il mio problema con 7zip
Devdatta Tengshe,

1
Un buon commento si riduce sostanzialmente a: perché un programma usa una cartella temporanea? Perché quando si trascina la selezione non si conosce la cartella di destinazione e si limita a "darla" a Windows, Windows prende il controllo e mette il file nel posto giusto.
Pieter B,

0

Se è necessario eseguire qualsiasi tipo di elaborazione dei dati nel file (decodifica / convertire / ecc.), È preferibile utilizzare un file temporaneo e, una volta completato, e solo se completato, trasferire il risultato alla destinazione finale.

Benefici:

  1. Solo i file completati raggiungono la destinazione
  2. Il file temporaneo può (dovrebbe) risiedere in supporti veloci
  3. Evita la frammentazione del file finale
  4. Consente l'uso di altri media come destinazione finale (ftp, cloud, qualunque cosa)
  5. I file temporanei interrotti sono più facili da pulire

Non vedo i reali vantaggi di scrivere direttamente a destinazione durante l'elaborazione dei dati.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.