2013-12-04 2 views
3

Я использую CSVHelper для преобразования списка объектов в csv, а затем сохраняю его на FTP-сервере, но длина содержимого некорректно рассчитана, поэтому конец содержимого усечен , Может ли кто-нибудь увидеть, что я делаю неправильно здесь;Неверная длина байта при использовании csvhelper и memorystream

using (var memoryStream = new MemoryStream()) 
     { 
     using (var streamWriter = new StreamWriter(memoryStream)) 
     { 
      using (var csvWriter = new CsvWriter(streamWriter)) 
      { 
      csvWriter.Configuration.Delimiter = ";"; 
      csvWriter.Configuration.HasHeaderRecord = false; 
      csvWriter.WriteRecords<MyObject>(myObjectList); 

      var request = (FtpWebRequest)WebRequest.Create(".../my.csv"); 
      request.Method = WebRequestMethods.Ftp.UploadFile; 
      request.Credentials = new NetworkCredential("user", "pass"); 
      request.ContentLength = memoryStream.Length; 
      byte[] fileContents = memoryStream.ToArray(); 
      Stream requestStream = request.GetRequestStream(); 
      requestStream.Write(fileContents, 0, fileContents.Length); 
      requestStream.Close(); 
      FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 
      response.Close(); 
      } 
     } 
     } 
    } 

Оба memoryStream.Length и fileContents.Length дает мне тот же номер, но он слишком мал по сравнению с количеством реальных данных.

+0

Является ли ваш CSVWriter тем же символьным кодированием, что и получатель FTP? – groverboy

+0

Все должно быть UTF-8, но я попытался явно установить его как для UTF8, так и для Unicode только для целей тестирования, и единственное, что он изменяет размер файла, ничего не происходит с контентом. Я должен проверить его немного больше, но кажется, что если я вызову streamWriter.Flush(); сразу после csvWriter.WriteRecords Я получаю правильную длину, и весь контент записывается в файл. – keysersoze

+0

CSVWriter должен буферировать свой вывод перед записью в поток; «Флеш» почти наверняка имеет значение. Он будет вызываться автоматически в конце предложения 'use'. Вероятно, вы можете упростить, переместив весь код ниже 'csvWriter.WriteRecords' после предложения - нет необходимости явно вызывать' Flush'. – groverboy

ответ

5

Вы не очищаете данные авторов до потока. A StreamWriter будет скрываться, когда он будет заполнен, но вам нужно вручную очистить его, когда вы закончите писать.

streamWriter.Flush();