C# Webclient Stream download file from FTP to local storage

c#, ftp, stream, webclient

Solution

Have you tried the following usage of `WebClient` class?

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

Update

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

If you want to download file explicitly using customized buffer size:

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

Problem

I've been downloading files from an FTP server via the `WebClient` object that the `.NET` namespace provides and then write the bytes to a actual file via a `BinaryWriter`. All is good. However, now, the files have dramatically increased in size and I'm worried about memory constraints so I'd like to create a download stream, create an file stream, and line by line read from the download and write to the file. I'm nervous since I couldn't find a nice example of this. Here's my end result: ``` 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()); } } } ``` Am I going about this incorrect/better way/etc?

Original source