2012-02-08 19 views
17

Ho sempre pensato che la risposta fosse sì, ma ora sto cercando di trovare la verità.I file creati con Path.GetTempFileName vengono puliti automaticamente?

Quando creo un file temporaneo utilizzando Path.GetTempFileName(), Windows lo ripulirà automaticamente in seguito?

Che dire se creo una directory sotto Path.GetTempPath()? Windows lo pulirà?

O è responsabilità dello sviluppatore eliminare i file creati lì?

risposta

10

No, non vengono eliminati automaticamente. Per creare un file che verrà eliminato automaticamente quando viene chiuso, passare FILE_FLAG_DELETE_ON_CLOSE a CreateFile.

Il file deve essere eliminato immediatamente dopo aver chiuso tutti i relativi handle, che include l'handle specificato e qualsiasi altra maniglia aperta o duplicata. Se sono presenti handle aperti su un file, la chiamata non riesce a meno che non siano stati tutti aperti con la modalità di condivisione FILE_SHARE_DELETE. Le richieste aperte successive per il file falliscono, a meno che non sia specificata la modalità di condivisione FILE_SHARE_DELETE.

Per accedere a questa funzionalità Win32 da .net, utilizzare la classe SafeFileHandle.

+1

'FILE_ATTRIBUTE_TEMPORARY' non cancellerà automaticamente il file. Quel flag si limita a suggerire al sistema operativo di cercare di memorizzare nella cache il file il più possibile e di rinunciare al supporto fisico. La bandiera che desideri è "FILE_FLAG_DELETE_ON_CLOSE". –

+0

@ JesseC.Slicer Hai ragione, il congelamento del cervello da parte mia. Ora ho corretto Grazie. –

+0

Nessun problema, signore! +1 per le informazioni. –

4

Per le mie app Windows Form &, ho aggiunto un evento per eliminare il file quando l'app viene chiusa. Mi piace:

private string GetTempFile() { 
    string tmpfile = Path.GetTempFileName(); 
    this.Closed += (object sender, EventArgs e) => { 
     if (File.Exists(tmpfile)) 
      File.Delete(tmpfile); 
    }; 
    return tmpfile; 
} 
1

Questo metodo ha funzionato bene per me. Tieni traccia quando il programma di apertura si chiude e quindi tenta di eliminare il file.

//Open it now and cleanup when program closes 
Process p = Process.Start(path); 
p.EnableRaisingEvents = true; 
p.Exited += (sender, e) => 
{ 
    try 
    { 
     File.Delete(path); 
    } 
    catch { } //Suppress errors 
}; 
1

La risposta alla domanda è no, e probabilmente non notare fino a raggiungere tmpFFFF.tmp e ottenere un errore. Se questo è su un server web, l'operazione fallirà.

Il nome del percorso utilizzato per i file temporanei dipende dal contesto. Quindi, se ricevi questo errore ed è una condizione di emergenza, assicurati di poter trovare rapidamente la cartella tmp corretta.

esecuzione come una console app su Windows 8 mi dà un percorso nella mia prpofile locale:

C:\Users\sweaver\AppData\Local\Temp\2\tmp4193.tmp 

E in IIS con Load User Profile = True per l'AppPool ottengo:

C:\Users\APPPOOL_NAME\AppData\Local\Temp

E quando Load User Profile = False Ottengo una maggiore maneggevolezza:

C:\Windows\TEMP\tmp7C32.tmp 

Si desidera pulire subito i file temporanei per evitare questo!

+0

Attenzione se si crea un file tmp e lo si elimina immediatamente. A volte il software di protezione antivirus salta dentro e prova a scansionarlo e quindi ti impedisce di cancellarlo. –

Problemi correlati