2012-08-16 2 views
6

Ich habe Dateien von einem FTP-Server über das WebClient Objekt heruntergeladen, das der .NET-Namespace bereitstellt, und dann die Bytes in eine tatsächliche Datei über eine BinaryWriter schreiben. Alles ist gut. Jetzt haben sich die Dateien jedoch dramatisch vergrößert und ich mache mir Sorgen über Speicherbeschränkungen. Daher möchte ich einen Download-Stream erstellen, einen Dateistream erstellen und Zeile für Zeile aus dem Download lesen und in die Datei schreiben.C# Webclient Stream-Download-Datei von FTP zu lokalem Speicher

Ich bin nervös, da ich kein schönes Beispiel dafür finden konnte. Hier ist mein Endergebnis:

var request = new WebClient(); 

// Omitted code to add credentials, etc.. 

var downloadStream = new StreamReader(request.OpenRead(ftpFilePathUri.ToString())); 
using (var writeStream = File.Open(toLocation, FileMode.CreateNew)) 
{ 
    using (var writer = new StreamWriter(writeStream)) 
    { 
     while (!downloadStream.EndOfStream) 
     { 
      writer.Write(downloadStream.ReadLine());     
     } 
    } 
} 

Gehe ich über diese falsche/bessere Weise/etc?

Antwort

8

Haben Sie die folgende Verwendung von WebClient Klasse versucht?

using (WebClient webClient = new WebClient()) 
{ 
    webClient.DownloadFile("url", "filePath"); 
} 

aktualisiert

using (var client = new WebClient()) 
using (var stream = client.OpenRead("...")) 
using (var file = File.Create("...")) 
{ 
    stream.CopyTo(file); 
} 

Wenn Sie Datei explizit mit angepassten Puffergröße herunterladen mögen:

public static void DownloadFile(Uri address, string filePath) 
{ 
    using (var client = new WebClient()) 
    using (var stream = client.OpenRead(address)) 
    using (var file = File.Create(filePath)) 
    { 
     var buffer = new byte[4096]; 
     int bytesReceived; 
     while ((bytesReceived = stream.Read(buffer, 0, buffer.Length)) != 0) 
     { 
      file.Write(buffer, 0, bytesReceived); 
     } 
    } 
} 
+0

Ja, und noch sind (das Request-Objekt ist ein WebClient [I‘ m update meinen Beitrag, um dies explizit zu zeigen]) aber DownladFile wird mir die gesamte Datei im Speicher geben - das Gegenteil von dem, was ich suche .. – OnResolve

+0

@OnResolve, sorry, habe ich nicht erwähnt. Bitte beachten Sie das Update. –

+0

@OnResolve, ich habe die Version mit der angepassten Puffergröße hinzugefügt. –