Writefile vs TransmitFile für große Dateien, die von dem Server nach der Übertragung gelöscht werden müssen

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

Frage

Ich muß Trigger Benutzer Downloads von großen Dateien auf einen Web-Browser, wo ich die Datei auf Übertragung auf dem Server erstellen, es dann unmittelbar danach löschen. Ich habe genug Beispiele gefunden, um zu sehen, dass ich wahrscheinlich Response.TransmitFile oder Response.WriteFile verwenden sollte ... aber haben es gehört, sind Probleme mit den beiden:

Writefile ist synchron, aber es puffert die Datei im Speicher, bevor sie an den Benutzer zu senden. Da ich mit sehr großen Dateien zu tun habe, dies zu Problemen führen könnte.

TransmitFile nicht lokal puffern, damit es Arbeit für große Dateien funktioniert, aber es ist asynchron, so dass ich nicht die Datei nach dem Aufruf von TransmitFile löschen. Offenbar die Datei Spülung garantiert nicht, dass ich es entweder löschen?

Was ist der beste Weg, damit umzugehen?

Es gibt die Binary auch ... könnte ich Schleife durch einen Datei-Stream, kopiert es in Segmenten?

War es hilfreich?

Lösung

Hier ist eine gute Lösung, die TransmitFile verwendet, aber ermöglicht es Ihnen, etwas zu tun, wenn es einen Delegierten getan werden:

http: // verbessern .dk / blog / 2008/03/29 / Antwort-TransmitFile-close-will-Kill-your-Anwendung

Ersetzen Sie einfach die Protokollierung am Ende mit Löschen von Dateien.

Andere Tipps

  

ist Writefile synchron, aber es   Puffer, die Datei im Speicher vor   Senden sie an den Benutzer. Da bin ich   mit sehr großen Dateien, diese   die dazu führen könnten Probleme.

Ich glaube, Sie die Pufferung Writefile durch Einstellung deaktivieren können Response.BufferOutput = false;

Wenn dieser Satz falsch war, sollte Sie in der Lage sein, Writefile aufrufen, ohne Pufferung ...

Könnten Sie die Datei auf der Festplatte (zufällige Namen usw.) begehen, und das Senden beginnen, sondern um einen Eintrag zu einer DB-Tabelle mit dem temporären Dateinamen hinzufügen, nach einer Periode der Zeit, die Sie definieren, haben einige Cleanupauftrag gehen durch diese DB Einträge und die Datei von der Festplatte löschen, wenn sie veralten hat.

Writefile Methode verwendet wird, um die kleine Datei vom Server herunterladen, die Größenparameter zwischen Null und dem maximalen Int32-Wert sein muss, bevor Sie die Datei überträgt es puffert die Datei im Speicher. TransmitFile Methode wird verwendet, um die große Datei vom Server herunterladen und puffern die Datei nicht in memory.But wenn versuchen, die Datei zu löschen, während es dann das Herunterladen es die Ausnahme auslöst. Unten ist der Code, der die Datei nach dem Download löschen würde.

 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");
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top