2012-08-16 10 views
6

Ho scaricato file da un server FTP tramite l'oggetto WebClient fornito dallo spazio dei nomi .NET e quindi i byte in un file reale tramite BinaryWriter. Va tutto bene. Tuttavia, ora i file sono notevolmente aumentati di dimensioni e sono preoccupato per i vincoli di memoria, quindi mi piacerebbe creare un flusso di download, creare un flusso di file e leggere riga per riga dal download e scrivere sul file.C# Webclient Stream scarica il file da FTP nella memoria locale

Sono nervoso perché non riuscivo a trovare un buon esempio di questo. Ecco il mio risultato finale:

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());     
     } 
    } 
} 

Sto andando in questo modo errato/migliore/etc?

risposta

8

Hai provato la seguente utilizzo di WebClient classe?

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

Aggiornamento

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

Se volete scaricare il file in modo esplicito utilizzando personalizzato dimensione del buffer:

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

Sì, e lo sono ancora (l'oggetto di richiesta è un WebClient [I' m aggiorna il mio post per mostrarlo esplicitamente]) ma DownladFile mi darà l'intero file in memoria - l'opposto di quello che sto cercando .. – OnResolve

+0

@OnResolve, mi dispiace, non l'ho menzionato. Si prega di consultare l'aggiornamento. –

+0

@OnResolve, ho aggiunto la versione con la dimensione del buffer personalizzata. –

Problemi correlati