使用csvhelper和memorystream时出现字节长度错误

4

我正在使用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 接收方相同的字符编码? - groverboy
一切都应该是UTF-8,但我已经尝试显式地将其设置为UTF8和Unicode,仅用于测试目的,它改变的唯一事情是文件大小,内容没有发生任何变化。我需要再进行一些测试,但似乎如果我在csvWriter.WriteRecords之后立即调用streamWriter.Flush();,则可以获得正确的长度并将所有内容写入文件。 - keysersoze
CSVWriter在写入流之前必须缓冲其输出;Flush几乎肯定会起到作用。它将在using子句结束时自动调用。可能您可以通过将csvWriter.WriteRecords下面的所有代码移至子句后来简化 - 无需显式调用Flush - groverboy
1个回答

6

您没有将写入器的数据刷新到流中。当 StreamWriter 容量已满时,它会自动刷新,但当您完成向其写入时,需要手动刷新。

streamWriter.Flush();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接