C# StreamWriter正在文件末尾写一行奇怪的代码
我使用StreamWriter将字符串写入内存,然后通过ASP.Net Core Web API中的IActionResult将其作为文件返回,我遇到了一个奇怪的问题,在输出文件的末尾出现了一行无法识别的字符 这是我所说的图像: 第513行的文字不应该在那里。。。我认为这与编码有关,但我对编码或文本知之甚少,所以我希望有更多知识的人能帮忙 这是我的密码:C# StreamWriter正在文件末尾写一行奇怪的代码,c#,asp.net-core,.net-core,C#,Asp.net Core,.net Core,我使用StreamWriter将字符串写入内存,然后通过ASP.Net Core Web API中的IActionResult将其作为文件返回,我遇到了一个奇怪的问题,在输出文件的末尾出现了一行无法识别的字符 这是我所说的图像: 第513行的文字不应该在那里。。。我认为这与编码有关,但我对编码或文本知之甚少,所以我希望有更多知识的人能帮忙 这是我的密码: [HttpGet("download/{fileId}")] public IActionResult DownloadFi
[HttpGet("download/{fileId}")]
public IActionResult DownloadFile(int fileId)
{
if (!_fileRepository.FileExists(fileId))
return NotFound();
var file = _fileRepository.GetFile(fileId);
if (!ModelState.IsValid)
return BadRequest(ModelState);
string BAIFile = ParseModelToFile(file);
using (MemoryStream ms = new MemoryStream())
{
using (var sw = new StreamWriter(ms, new UnicodeEncoding()))
{
sw.Write(BAIFile);
sw.Flush();
sw.Close();
return File(ms.GetBuffer(), "text/plain", DateTime.Now.ToShortDateString() + ".BAI");
}
}
}
为了提高性能,
MemoryStream
尝试限制调整内部缓冲区大小的频率。因此,它所做的是,每次您编写时,如果它需要扩展其存储容量,它将调整该容量,使其超出所需的大小。这样,下一次写入也不会导致调整大小
这意味着,例如,它的缓冲区可能是2048字节,而您的实际内容只有1900字节。最后148字节?这就是你看到的垃圾
您得到的是整个缓冲区,它实际上比您的实际内容长。改用
ToArray()
。这将返回一个缓冲区副本,只包含您的实际内容,而不包含剩余的额外空间。解释了您的问题并给出了解决方案。另一方面,您可以避免再次处理当前数组或使用流,而只需调用返回文件(Encoding.UTF8.GetBytes(BAIFile),“text/plain”
etc..@BrandonMiller不客气。您可以看到这一点。在变量中同时获取ToArray()
和GetBuffer()
,并查看它们的大小。然后查看内存流的长度
和容量
属性。您将看到一个模式。