Dovrei scrivere un file temporaneo ad una directory temporanea? o scrivere un file temporaneo nella directory finale?

StackOverflow https://stackoverflow.com/questions/1128772

Domanda

Quando un'applicazione salva un file, un modello tipico è quello di salvare il file in una posizione temporanea, quindi spostare il file temporaneo alla posizione finale. In alcuni casi, che "movimento" diventa "sostituire". In pseudo codice:

Save temp file;
if final file exists
   delete final file;
move temp file to final filename;

C'è una finestra in là, dove la cancellazione potrebbe avere successo, ma la mossa non può, in modo da poter gestire tale da qualcosa come:

Save temp file;
if final file exists
   move final file to parking lot
move temp file to final filename;
if move succeeded       
   delete previous final file. 
else
   restore previous final file. 

Ora alle mie domande:

  1. è preferito salvare il file temporaneo in una directory temporanea, e quindi spostarlo, in contrasto con il salvataggio del file temporaneo nella directory finale? (Se sì, perché?)

  2. C'è una differenza negli attributi e le autorizzazioni su un file che viene prima salvato a una directory temp, per poi trasferirsi al file finale in una directory diversa, rispetto a un file che viene salvato in un file temporaneo < em> nella directory finale , e poi rinominato all'interno della directory?

  3. Se le risposte a entrambi sono SI, allora come posso fare la cosa preferita mentre ottenere l'ACL appropriato sul file di cui è stato prima salvato in una directory temporanea e poi spostato in una directory finale?

È stato utile?

Soluzione

Crea un file temporaneo nella cartella temporanea se è solo un file temporaneo. In caso contrario, creare nella sua destinazione finale.

Avvertenze:

1) questo potrebbe non funzionare se la destinazione finale è una cartella 'pick-up' (a meno che i controlli di processo 'pick-up' per i file bloccati (che dovrebbe))

2) La destinazione finale dispone di autorizzazioni speciali che devono essere creato in codice e applicata prima di poter passare alla destinazione finale.

Altri suggerimenti

Microsoft Word salva un file temporaneo nella directory originale inizia con una tilde (~). Vorrei solo seguire questa convenzione.

Se questi sono i file temporanei che si trasformano in file permanenti, crearli nella stessa posizione per evitare qualsiasi rischio di dover file "Move" in tutta dischi / partizioni, che si tradurrà in più di I / O (come una copia seguita da una cancellazione).

Se questi sono i file temporanei che sono veramente temporanea, creare (e lasciarli) nella directory Temp.

Una delle ragioni per cui si potrebbe desiderare di non scrivere un file in una directory e spostarlo in un altro è perché queste directory potrebbero essere diversi filesystem. Anche se questo è meno spesso un problema su Windows, è ancora ragionevolmente possibile a condizione che il filesystem genitore è ntfs. In UNIX, si tratta di una pratica standard per / tmp di essere un file system diverso.

Il motivo per cui questo potrebbe essere un problema è perché questo significa che il file deve essere copiato da un luogo ad un altro. Questo prestazioni in modo significativo l'impatto per i file di dimensioni considerevoli, e che certamente richiedono molti di più cerca, anche se il file è di piccole dimensioni. Inoltre, ci sono molti altri modi per questo a fallire quando si sposta un file attraverso i confini del file system. Di coursea autorizzazioni di accesso potrebbero essere diversi, ma anche il filesystem di destinazione potrebbe essere pieno, o un qualsiasi numero di altre complicazioni aggiuntive che ora si sta rimandando solo molto più tardi.

  1. È preferibile creare un file temporaneo utilizzando le routine GetTempFile perché questo crea file temporanei in luoghi predefiniti. (Ad esempio C: \ Temp) che utilità può cancellare in caso di blocco app o rende i file corrotti in Se stesso cosa accade nella vostra directory finale, è irreversibile.

  2. Sì, attributi potrebbe essere diverso se sono stati modificati gli attributi del file o ACL. Ciò potrebbe accadere anche se si crea il file temporaneo nella stessa cartella.

  3. È risolvere questo problema utilizzando la routine File.Replace, che svolge un sostituto atomico di un file con un altro, in sostituzione di attributi e ACL del nuovo del file con il vecchio file del.

A # metodo di C che non si tratta di una risposta a aggiornamento flusso sicuro dei file di .

Io preferisco salvare il file temporaneo nella directory finale:

  1. Si evita i potenziali problemi di autorizzazione che hai descritto.

  2. La directory finale potrebbe essere su un volume diverso, nel qual caso la mossa (del temporaneo per il file finale) è in realtà una copia + delete - che comporta un sacco di overhead se lo si fa spesso o se il file è grande.

È sempre possibile rinominare il file esistente in un secondo file temporanei, rinominare il nuovo file temporaneo al nome del file esistente, e rollback in caso di errore. Questo mi sembra essere la combinazione più sicura.

A CURA :. Vedo che il vostro "parcheggio" già descritto il mio suggerimento, quindi non sono sicuro che ho aggiunto molto qui

1. Sì, si preferisce salvare in un file temporaneo prima

Visto che il file finale sarà non essere in uno stato corrotto deve la creazione del file non riesce per qualsiasi motivo. Se si scrive direttamente al file finale e il programma si è schiantato a metà strada ... sarà sicuramente lasciare il file finale in uno stato non valido.

2. Sì

Gli attributi "ereditati" e le autorizzazioni saranno naturalmente, essere diversi. Ma directory temporanee sulla maggior parte dei sistemi di solito sono pre-configurati per tutte le applicazioni da utilizzare. La directory "del file finale" potrebbe, tuttavia, hanno bisogno di essere configurato. Di 'la cartella "Programmi" e Vista UAC, per esempio.

3. Copia ACL dal file finale per il file temporaneo prima di sostituire?

Per impostazione predefinita Android pone TMP come suffisso quando il parametro suffisso è impostata su null a File.createTempFile (). Vorrei suggerire di usare solo questo.

File file = File.createTempFile(imageFileName, null, storageDir);

Si dovrebbe chiamare File.Delete () da soli non appena hai finito con il file TMP nella vostra app. Non si deve dipendere da file.deleteOnExit () in quanto non c'è assolutamente alcuna garanzia che sarà utilizzato dal sistema Android / VM.

Perché non rendere configurabili dall'utente? Alcuni utenti non amano i file temporanei inquinanti loro directory corrente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top