我最初的要求是让用户从对象列表中下载一个文件,我找到了这个解决方案https://stackoverflow.com/a/49207997/11178128,
但问题是涉及到这条线
bin = stream.ToArray();
没有写入流的流。所以bin作为一个空数组。可能是什么问题呢?
另外,我正在通过Windows服务提供我的Web API。由于某种原因,System.Web.HttpContext.Current.Response
给了我null。知道为什么会这样吗?提前致谢。
这是我到目前为止的代码,
List<Device> devices;
using (StreamReader r = new StreamReader(String.Format(@"{0}\deviceList.json", savefilePath)))
{
string json = r.ReadToEnd();
devices = JsonConvert.DeserializeObject<List<Device>>(json);
}
byte[] bin;
//String.Format(@"{0}\devices.csv", savefilePath)
using (MemoryStream stream = new MemoryStream())
using (TextWriter textWriter = new StreamWriter(stream))
using (CsvWriter csv = new CsvWriter(textWriter))
{
csv.Configuration.ShouldQuote = (field, context) => false;
csv.WriteRecords(devices);
bin = stream.ToArray();
}
这与另一个问题CsvHelper not writing anything to memory stream有关。你只需要更改你的using语句,以便在调用StreamWriter
之前刷新stream.ToArray();
List<Device> devices;
using (StreamReader r = new StreamReader(String.Format(@"{0}\deviceList.json", savefilePath)))
{
string json = r.ReadToEnd();
devices = JsonConvert.DeserializeObject<List<Device>>(json);
}
byte[] bin;
//String.Format(@"{0}\devices.csv", savefilePath)
using (MemoryStream stream = new MemoryStream())
{
using (TextWriter textWriter = new StreamWriter(stream))
using (CsvWriter csv = new CsvWriter(textWriter))
{
csv.Configuration.ShouldQuote = (field, context) => false;
csv.WriteRecords(devices);
}
bin = stream.ToArray();
}
实际上,经过一番挣扎,发现我错过了这条线。
textWriter.Flush();
如下面的回复所述,我必须刷新textWriter对象才能写入文件。这是工作代码。
byte[] data;
using (MemoryStream stream = new MemoryStream())
using (TextWriter textWriter = new StreamWriter(stream))
using (CsvWriter csv = new CsvWriter(textWriter))
{
csv.Configuration.RegisterClassMap<DeviceMap>();
csv.Configuration.ShouldQuote = (field, context) => false;
csv.WriteRecords(values);
textWriter.Flush();
data = stream.ToArray();
}
return data;