.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 lo hará. Es por esto que http://msdn.microsoft.com/en-us/library/system.io.path.gettempfilename.aspx dice específicamente "El método GetTempFileName generará una excepción IOException si no hay un nombre de archivo temporal único disponible. Para resolver este problema error, borre todos los archivos temporales innecesarios ".
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;
}