with gettempfilename extension .net temporary-files

.net - path gettempfilename with extension



¿Los archivos creados con Path.GetTempFileName se limpian automáticamente? (5)

Este método funcionó bien para mí. Realice un seguimiento cuando se cierre el programa de apertura y luego intente eliminar el archivo.

//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 };

Siempre he asumido que la respuesta es sí, pero ahora estoy tratando de encontrar la verdad.

Cuando creo un archivo temporal con Path.GetTempFileName() , ¿Windows lo limpiará automáticamente más tarde?

¿Qué pasa si creo un directorio en Path.GetTempPath() ? ¿Las ventanas lo limpiarán?

¿O es responsabilidad del desarrollador eliminar los archivos creados allí?


La respuesta a la pregunta es no, y probablemente nunca lo notará hasta que llegue a tmpFFFF.tmp y obtenga un error. Si esto está en un servidor web, su operación va a fallar.

El nombre de ruta utilizado para los archivos temporales depende del contexto. Por lo tanto, si recibe este error y es una condición de emergencia, querrá asegurarse de poder encontrar rápidamente la carpeta tmp correcta.

Ejecutar como una aplicación de consola en Windows 8 me da una ruta en mi perfil local:

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

Y en IIS con Load User Profile = True para AppPool obtengo:

C:/Users/APPPOOL_NAME/AppData/Local/Temp

Y cuando Load User Profile = False me sale más manejable:

C:/Windows/TEMP/tmp7C32.tmp

¡Desea limpiar sus archivos temporales de inmediato para evitar esto!



No, no se eliminan automáticamente. Para crear un archivo que se eliminará automáticamente cuando se cierre, pase FILE_FLAG_DELETE_ON_CLOSE a FILE_FLAG_DELETE_ON_CLOSE .

El archivo se eliminará inmediatamente después de que todos sus controladores estén cerrados, lo que incluye el controlador especificado y cualquier otro controlador abierto o duplicado. Si existen identificadores abiertos en un archivo, la llamada falla a menos que todos se hayan abierto con el modo compartido FILE_SHARE_DELETE . Las solicitudes de apertura posteriores para el archivo fallan, a menos que se especifique el modo de compartir FILE_SHARE_DELETE .

Para obtener acceso a esta funcionalidad de Win32 desde .net, use la clase SafeFileHandle .


Para mis aplicaciones Windows Forms y WPF, agregué un evento para eliminar el archivo cuando se cierra la aplicación. Me gusta esto:

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