WriteFile vs TransmitFile pour les gros fichiers qui doivent être supprimés du serveur après le transfert

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

Question

Je dois déclencher utilisateur télécharge de gros fichiers à un navigateur Web, où je crée le fichier à transférer sur le serveur, puis supprimez-le immédiatement après. Je l'ai trouvé assez d'exemples pour voir que je devrais probablement utiliser Response.TransmitFile ou Response.WriteFile ... mais ai entendu dire qu'il ya des problèmes à la fois:

WriteFile est synchrone, mais il tamponne le fichier dans la mémoire avant de l'envoyer à l'utilisateur. Depuis que je traite des fichiers très volumineux, cela pourrait causer des problèmes.

TransmitFile il ne fait pas localement tampon travail pour les gros fichiers, mais il est asynchrone, je ne peux pas supprimer le fichier après avoir appelé TransmitFile. Apparemment, le rinçage fichier ne garantit pas que je peux le supprimer soit?

Quelle est la meilleure façon de faire face?

Il est le BinaryWrite aussi ... pourrais-je boucle à travers un flux de fichiers, le copier dans les segments?

Était-ce utile?

La solution

Voici une bonne solution qui utilise TransmitFile mais vous permet de faire quelque chose une fois qu'il a fait à l'aide d'un délégué:

http: // améliorer .dk / blog / 2008/03/29 / réponse-TransmitFile-close-will-kill-votre application

Il suffit de remplacer l'enregistrement à la fin avec la suppression de fichiers.

Autres conseils

  

WriteFile est synchrone, mais   tampons le fichier dans la mémoire avant   l'envoyer à l'utilisateur. Depuis que je suis   traiter des fichiers très volumineux, ce   pourrait causer des problèmes.

Je crois que vous pouvez désactiver la mise en mémoire tampon à WriteFile en réglant Response.BufferOutput = false;

Une fois que cela a été défini sur false, vous devriez être en mesure d'appeler WriteFile sans mise en mémoire tampon ...

Pourriez-vous valider le fichier à disque (etc nom aléatoire), et commencer à envoyer, mais ajouter une entrée à une table DB avec le nom de fichier temporaire, après une période de temps que vous définissez, ont dans une certaine travail de nettoyage à travers les entrées DB , et supprimez le fichier à partir du disque si elle a vieilli sur.

WriteFile méthode est utilisée pour télécharger le petit fichier à partir du serveur, le paramètre de taille doit être comprise entre zéro et la valeur Int32 maximale, avant de transférer le fichier, il tamponne le fichier dans la mémoire. TransmitFile méthode est utilisé pour télécharger le fichier volumineux à partir du serveur et il ne cache pas le fichier dans memory.But lorsque vous essayez de supprimer le fichier lors du téléchargement alors il jette l'exception. Ci-dessous le code qui supprimerait le fichier après l'avoir téléchargé.

 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");
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top