WriteFile vs TransmitFile de archivos de gran tamaño que necesitan ser eliminado del servidor después de la transferencia

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

Pregunta

Tengo que usuario descarga gatillo de archivos de gran tamaño a un navegador web, donde se crea el archivo de transferencia en el servidor, a continuación, elimínelo inmediatamente después. He encontrado suficientes ejemplos para ver que probablemente debería utilizar Response.TransmitFile o Response.WriteFile ... pero he oído que hay problemas con ambos:

WriteFile es sincrónico, pero amortigua el archivo en la memoria antes de enviarlo al usuario. Desde que estoy tratando con archivos muy grandes, esto podría causar problemas.

TransmitFile no amortiguar localmente por lo que funciona para archivos de gran tamaño, pero es asíncrono, así que no puedo eliminar el archivo después de llamar TransmitFile. Al parecer, el lavado del archivo no garantiza que pueda borrarlo o bien?

¿Cuál es la mejor manera de hacer frente a esto?

No es la BinaryWrite también podría ... Me bucle a través de una secuencia de archivo, copiarlo en segmentos?

¿Fue útil?

Solución

Esta es una buena solución que utiliza TransmitFile pero le permite hacer algo una vez que se hace uso de un delegado:

http: // mejorar .dk / blog / 2008/03/29 / respuesta de TransmitFile-cerca-will-kill-su-aplicación

Sólo reemplazar el registro al final con la eliminación de archivos.

Otros consejos

  

WriteFile es sincrónico, pero   amortiguadores del archivo en la memoria antes   enviarlo al usuario. Desde que estoy   tratar con archivos muy grandes, esto   podría causar problemas.

Creo que se puede desactivar el almacenamiento temporal de escritura de archivo de configuración Response.BufferOutput = false;

Una vez que esto ha sido ajustada a falsa que debe ser capaz de llamar escritura de archivo sin búfer ...

Podría cometer el archivo en el disco (nombre aleatorio, etc), y empezar a enviar, pero añadir una entrada en una tabla de base de datos con el nombre de archivo temporal, después de un período de tiempo definido, tienen algunos van trabajo de limpieza a través de esas entradas DB y eliminar el archivo desde el disco si se ha envejecido a cabo.

WriteFile método se utiliza para descargar el pequeño archivo desde el servidor, el parámetro de tamaño debe estar entre cero y el valor máximo Int32, antes de transferir el archivo que amortigua el archivo en la memoria. TransmitFile método se utiliza para descargar el archivo grande desde el servidor y no almacena el archivo en memory.But cuando se trate de eliminar el archivo mientras se descarga, entonces se produce la excepción. A continuación se muestra el código que eliminar el archivo después de descargarlo.

 FileStream fs = new FileStream(@"D:\FileDownLoad\DeskTop.zip", FileMode.OpenOrCreate);
        MemoryStream ms = new MemoryStream();
        fs.CopyTo(ms);
        context.Response.AppendHeader("content-disposition", "attachment; filename=" + "DeskTop.zip");
        context.Response.ContentType = "application/octet-stream";
        context.Response.BinaryWrite(ms.ToArray());
        fs.Close();
        File.Delete(@"D:\FileDownLoad\DeskTop.zip");
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top