我正在动态生成CSV数据导出.我这样做是通过获取项的哈希集,然后逐行转换它们并将它们写入MemoryStream,然后将其作为FileResult发送到客户端.问题是文件末尾有大约一百万个NULL字符,我猜这些字符的数量等于hashset中的项目数.但它们位于文件的末尾,而不是每行的结尾.
无论如何,代码是这样的:
Controller方法:
public ActionResult ExportList(ListExportModel model)
{
System.IO.MemoryStream ms = ls.ExportListToCsv(model,Server.MapPath("~/uploads"));
return File(ms.GetBuffer(),"text/csv",model.MailingList.ListName + ".csv");
}
Run Code Online (Sandbox Code Playgroud)
ExportListToCsv方法
public MemoryStream ExportListToCsv(ListExportModel model, string folderpath)
{
MemoryStream stream = new MemoryStream();
StreamWriter writer = new StreamWriter(stream);
writer.WriteLine(string.Join(",", model.Columns));
var data = GetListItemsFromCsv(model.ListId, folderpath);
XmlDocument doc = new XmlDocument();
// Parallel.ForEach(data, (li) =>
foreach (var li in data)
{
string line = "";
foreach (var field in model.Columns)
{
doc.LoadXml(li.CustomFields);
switch (field)
{
//our standard fields
case "email":
line += li.Email + …Run Code Online (Sandbox Code Playgroud) 从我可以收集,然后使用POSIXO_DIRECT与open()阻断设备文件的工作方式的方式既结合同FILE_FLAG_WRITE_THROUGH,并FILE_FLAG_NO_BUFFERING与CreateFile()在Windows上-这是正确的我假设?
打开:
O_DIRECT尽量减少进出该文件的 I/O 的缓存影响。通常这会降低性能,但它在特殊情况下很有用,例如当应用程序执行自己的缓存时。文件 I/O 直接进出用户空间缓冲区。
创建文件:
如果FILE_FLAG_WRITE_THROUGH使用,但FILE_FLAG_NO_BUFFERING 是不是也规定,使系统缓存中的效果,然后将数据写入到系统缓存,但被刷新到磁盘刻不容缓。如果FILE_FLAG_WRITE_THROUGH和FILE_FLAG_NO_BUFFERING 都被指定,那么系统缓存没有生效,那么数据会立即刷新到磁盘而不经过 Windows 系统缓存。操作系统还请求将硬盘的本地硬件缓存写入持久性媒体。