FTP в C # возвращает поврежденный файл, почему? - PullRequest
3 голосов
/ 21 июля 2009

У меня есть этот метод для передачи файлов с использованием FTP-сервера:

private void TransferNeededFiles(IEnumerable<string> filenames)
{
    foreach (var filename in filenames)
    {
        var request = WebRequest.Create(new Uri(@"ftp://{0}/{1}".Fill(Config.ServerUri, filename))) as FtpWebRequest;

        if (request != null)
        {
            request.Credentials = new NetworkCredential(Config.Username, Config.Password);

            request.Method = WebRequestMethods.Ftp.DownloadFile;
            using (var streamReader = new StreamReader(request.GetResponse().GetResponseStream()))
            {
                var fileStream = new FileStream(@"{0}/{1}".Fill(Config.DestinationFolderPath, filename), FileMode.Create);

                var writer = new StreamWriter(fileStream);
                writer.Write(streamReader.ReadToEnd());
                writer.Flush();
                writer.Close();

                fileStream.Close();
            }
        }
    }
}

Файл .gz, включенный в список имен файлов, всегда поврежден. Когда я пытаюсь скопировать из ftp с помощью проводника Windows, файл не поврежден. Вы знаете, что происходит?

Ответы [ 2 ]

7 голосов
/ 21 июля 2009

Проблема в этой строке:

writer.Write(streamReader.ReadToEnd());

StreamReader.ReadToEnd() возвращает строку в кодировке Unicode. Вы хотите что-то, что будет читать поток байта за байтом.

3 голосов
/ 21 июля 2009

Reader с и Writer с работают с символами Юникода. Для передачи двоичных данных вы хотите работать с необработанными байтами, поэтому вы должны использовать обычные Stream s. Вы можете копировать из одного потока в другой с помощью цикла, подобного следующему:

BufferedStream inputStream, outputStream;
byte[] buffer = new byte[4096];
int bytesRead;

while ((bytesRead = inputStream.Read(buffer)) > 0)
{
    outputStream.Write(buffer, 0, bytesRead);
}

Хорошо, что в этом случае он будет использовать только фиксированный объем памяти, а не считывать весь файл в память сразу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...