【问题标题】:Wrong byte-length when using csvhelper and memorystream使用 csvhelper 和 memorystream 时错误的字节长度
【发布时间】:2013-12-20 07:31:49
【问题描述】:

我正在使用 CSVHelper 将对象列表转换为 csv,然后将其保存到 FTP - 但内容的长度未正确计算,因此内容的结尾被截断。谁能看到我在这里做错了什么;

    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 都给了我相同的数字,但与实际数据量相比它太小了。

【问题讨论】:

  • 您的 CSVWriter 是否使用与 FTP 收件人相同的字符编码?
  • 一切都应该是 UTF-8,但我已经尝试明确地将它设置为 UTF8 和 Unicode 只是为了测试目的,唯一改变它的是文件大小,内容没有任何变化。我必须对其进行更多测试,但似乎如果我调用 streamWriter.Flush();就在 csvWriter.WriteRecords 之后,我得到了正确的长度,并且所有内容都写入了文件。
  • CSVWriter 必须在写入流之前缓冲其输出; Flush 几乎可以肯定会有所作为。它将在using 子句的末尾自动调用。可能您可以通过将所有代码移到子句之后的csvWriter.WriteRecords 下面来简化 - 无需显式调用Flush

标签: c# streamwriter memorystream ftpwebrequest csvhelper


【解决方案1】:

您没有将写入器数据刷新到流中。 StreamWriter 写满后会自行刷新,但写完后需要手动刷新。

streamWriter.Flush();

【讨论】:

    猜你喜欢
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    相关资源
    最近更新 更多