C# Memorystream 没有完全保存到文件中
C# Memorystream is not fully saved to the file
我正在使用 MemoryStream
和 StreamWriter
将对象导出到 csv。但是保存文件后,我发现文件末尾不见了。它在一条线的中间截断。
下面是我的代码:
public void Export(ProductExport productExport)
{
var country = (Country)(int.Parse(productExport.Firma.Code));
using(var stream = new MemoryStream())
{
var sw = new StreamWriter(stream);
// Write header row
sw.WriteLine(
"{0};{1};{2};{3};{4};{5};{6};{7};{8};{9}",
"Groep",
"TecDoc Leverancier",
"TecDoc Ref",
"SA",
"EAN",
"Omschrijving NL",
"V/E",
"VPE",
"Prijs per",
"Bruto prijs"
);
foreach(var product in productExport.Products)
{
// Write header row
sw.WriteLine(
"{0};{1};{2};{3};{4};{5};{6};{7};{8};{9}",
product.Artgrp,
product.TecDoc != null ? product.TecDoc.Supplier : "",
product.TecDoc != null ? product.TecDoc.Value : "",
product.Ids.Where<Id>(i => i.Type == "SA").Select(i => i.Value).DefaultIfEmpty("").First(),
product.Ids.Where<Id>(i => i.Type == "EN").Select(i => i.Value).DefaultIfEmpty("").First(),
product.Descriptions.Where<Description>(d => d.Lang == "NL").Select(i => i.Value).DefaultIfEmpty("").First(),
product.SalesUnit,
product.PackingUnit.Value,
product.PriceUnit.Value,
product.Prices.First<Price>(p => p.Type == "BR" && p.Country == country.ToString()).Value
);
}
FileSystem.AddFile(country + "-" + String.Format("{0:yyyyMMdd}", DateTime.Now) + ".csv", stream);
sw.Flush();
}
}
这是 FileSystem.AddFile()
函数的代码:
public void AddFile(string path, System.IO.Stream stream)
{
var fullPath = GetFullPath(path);
var directory = Path.GetDirectoryName(fullPath);
if (directory == null) throw new InvalidOperationException("Can't get the directory.");
Directory.CreateDirectory(directory); // Make sure the directory is created!
if (stream.CanSeek)
stream.Seek(0, SeekOrigin.Begin);
using (var destination = (Stream)File.Create(fullPath))
stream.CopyTo(destination);
}
先sw.Flush()
,然后FileSystem.AddFile()
。 StreamWriter
可能在将输出传递给 MemoryStream
之前缓冲输出。
您需要先刷新 StreamWriter
,然后从流中创建文件。
我正在使用 MemoryStream
和 StreamWriter
将对象导出到 csv。但是保存文件后,我发现文件末尾不见了。它在一条线的中间截断。
下面是我的代码:
public void Export(ProductExport productExport)
{
var country = (Country)(int.Parse(productExport.Firma.Code));
using(var stream = new MemoryStream())
{
var sw = new StreamWriter(stream);
// Write header row
sw.WriteLine(
"{0};{1};{2};{3};{4};{5};{6};{7};{8};{9}",
"Groep",
"TecDoc Leverancier",
"TecDoc Ref",
"SA",
"EAN",
"Omschrijving NL",
"V/E",
"VPE",
"Prijs per",
"Bruto prijs"
);
foreach(var product in productExport.Products)
{
// Write header row
sw.WriteLine(
"{0};{1};{2};{3};{4};{5};{6};{7};{8};{9}",
product.Artgrp,
product.TecDoc != null ? product.TecDoc.Supplier : "",
product.TecDoc != null ? product.TecDoc.Value : "",
product.Ids.Where<Id>(i => i.Type == "SA").Select(i => i.Value).DefaultIfEmpty("").First(),
product.Ids.Where<Id>(i => i.Type == "EN").Select(i => i.Value).DefaultIfEmpty("").First(),
product.Descriptions.Where<Description>(d => d.Lang == "NL").Select(i => i.Value).DefaultIfEmpty("").First(),
product.SalesUnit,
product.PackingUnit.Value,
product.PriceUnit.Value,
product.Prices.First<Price>(p => p.Type == "BR" && p.Country == country.ToString()).Value
);
}
FileSystem.AddFile(country + "-" + String.Format("{0:yyyyMMdd}", DateTime.Now) + ".csv", stream);
sw.Flush();
}
}
这是 FileSystem.AddFile()
函数的代码:
public void AddFile(string path, System.IO.Stream stream)
{
var fullPath = GetFullPath(path);
var directory = Path.GetDirectoryName(fullPath);
if (directory == null) throw new InvalidOperationException("Can't get the directory.");
Directory.CreateDirectory(directory); // Make sure the directory is created!
if (stream.CanSeek)
stream.Seek(0, SeekOrigin.Begin);
using (var destination = (Stream)File.Create(fullPath))
stream.CopyTo(destination);
}
先sw.Flush()
,然后FileSystem.AddFile()
。 StreamWriter
可能在将输出传递给 MemoryStream
之前缓冲输出。
您需要先刷新 StreamWriter
,然后从流中创建文件。