Ftpwebrequest Скачать файл неверный размер
-
02-10-2019 - |
Вопрос
Я использую следующий код для загрузки файла с удаленного сервера FTP:
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverPath);
request.KeepAlive = true;
request.UsePassive = true;
request.UseBinary = true;
request.Method = WebRequestMethods.Ftp.DownloadFile;
request.Credentials = new NetworkCredential(userName, password);
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
using (Stream responseStream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(responseStream))
using (StreamWriter destination = new StreamWriter(destinationFile))
{
destination.Write(reader.ReadToEnd());
destination.Flush();
}
Файл, который я загружаю, это DLL, и моя проблема в том, что она изменится этим процессом каким-то образом. Я знаю это, потому что размер файла увеличивается. У меня есть подозрение, что этот раздел кода не виноват:
destination.Write(reader.ReadToEnd());
destination.Flush();
Кто-нибудь может предложить любые идеи относительно того, что может не так?
Решение
StreamReader
и StreamWriter
Работайте с символьными данными, поэтому вы декодируете поток из байтов к символам, а затем снова кодируете его к байтам. Файл DLL содержит двоичные данные, поэтому это преобразование круглого отключения приведет к ошибкам. Вы хотите прочитать байты напрямую из responseStream
объект и писать в FileStream
это не завернут в StreamWriter
.
Если вы используете .NET 4.0, вы можете использовать Stream.CopyTo
, но иначе вам придется скопировать поток вручную. Этот вопрос стойки Имеет хороший метод копирования потоков:
public static void CopyStream(Stream input, Stream output)
{
byte[] buffer = new byte[32768];
while (true)
{
int read = input.Read(buffer, 0, buffer.Length);
if (read <= 0)
return;
output.Write(buffer, 0, read);
}
}
Итак, ваш код будет выглядеть так:
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
using (Stream responseStream = response.GetResponseStream())
using (FileStream destination = File.Create(destinationFile))
{
CopyStream(responseStream, destination);
}