2012-04-04 16 views
0

Ich habe eine große Zip-Datei (500 MB oder höher), die ich in einen Memorystream lese und zurück als Filestreamresult. Ich bekomme jedoch eine OutOfMemory-Ausnahme für Dateien über 200 MB. In meiner Aktion habe ich den folgenden Code:ASP MVC Filestreamresult OutOfMemoryException

MemoryStream outputStream = new MemoryStream(); 
using (var fs = new FileStream(filepath, FileMode.Open, FileAccess.Read)) 
{ 
    //Response.BufferOutput = false; // to prevent buffering 
    byte[] buffer = new byte[1024]; 
    int bytesRead = 0; 
    while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     outputStream.Write(buffer, 0, bytesRead); 
    } 
} 

outputStream.Seek(0, SeekOrigin.Begin); 
return new FileStreamResult(outputStream, content_type); 
+0

Ich möchte nicht ReadAllBytes wegen 2GB Grenze und auch wegen der Speicherprobleme beim Lesen der gesamten Datei in den Speicher auf einmal verwenden. – user327999

Antwort

2

Wenn Sie die Datei in einen Memorystream zu lesen müssen Sie noch den Speicher für die gesamte Datei zuzuordnen, da intern die Memorystream ist nichts anderes als ein Byte-Array.

So gerade lesen Sie die Datei in einen großen Speicherpuffer einen kleineren Zwischen (auch im Speicher) Puffer.

Warum leiten Sie die Datei-Stream nicht direkt mit dem Filestreamresult?

+0

Ich erhalte ein Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird, wenn dieser Ansatz versucht. – user327999

+0

Entschuldigung, dass die Antwort so spät ist, bemerkte es nicht früher. Dies sollte helfen: neuer FileStream (Dateipfad, FileMode.Open, FileAccess.Read, FileShare.Read). Es erlaubt das mehrfache Öffnen der Datei, solange es sich um Lesezugriff handelt. – Fionn

+0

Konnte das nicht zur Arbeit bringen. Wenn ich die using's entferne gibt es eine Ausnahme für den Speicher. Wenn es die Verwendung meiner mvc App enthält, 302 verweist auf unsere Fehlerseite ... Nicht sicher, warum. – RayLoveless