Вау, спасибо за такое подробное объяснение! Это действительно помогло мне.

ользую .NET 4 C #. Я пытаюсь загрузить и затем загрузить ZIP-файл на (мой) сервер.

Для загрузки у меня есть

using (WebClient client = new WebClient())
{
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(MyUrl);
    request.Method = WebRequestMethods.Ftp.UploadFile;
    request.EnableSsl = false;
    request.Credentials = new NetworkCredential(MyLogin, MyPassword);
    byte[] fileContents = null;
    using (StreamReader sourceStream = new StreamReader(LocalFilePath))
    {
        fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
    }
    request.ContentLength = fileContents.Length;
    using (Stream requestStream = request.GetRequestStream())
    {
        requestStream.Write(fileContents, 0, fileContents.Length);
    }
    FtpWebResponse response = null;
    response = (FtpWebResponse)request.GetResponse();
    response.Close();
}

Кажется, это работает, так как я получаю файл на сервере нужного размера.

1) Как мне транслировать его, а не загружать в память? Я буду загружать очень большие файлы.

И для скачивания у меня есть

using (WebClient client = new WebClient())
{
    string HtmlResult = String.Empty;
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(remoteFile);
    request.Method = WebRequestMethods.Ftp.DownloadFile;
    request.EnableSsl = false;
    request.Credentials = new NetworkCredential(MyLogin, MyPassword);
    using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
    using (Stream responseStream = response.GetResponseStream())
    using (StreamReader reader = new StreamReader(responseStream))
    using (FileStream writer = new FileStream(localFilename, FileMode.Create))
    {
        long length = response.ContentLength;
        int bufferSize = 2048;
        int readCount;
        byte[] buffer = new byte[2048];
        readCount = responseStream.Read(buffer, 0, bufferSize);
        while (readCount > 0)
        {
            writer.Write(buffer, 0, readCount);
            readCount = responseStream.Read(buffer, 0, bufferSize);
        }
    }
}

2) Кажется, все работает ... за исключением случаев, когда я пытаюсь распаковать загруженный ZIP-файл, я получаю неверный ZIP-файл.

Ответы на вопрос(1)

Ваш ответ на вопрос