Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# StreamWriter正在文件末尾写一行奇怪的代码_C#_Asp.net Core_.net Core - Fatal编程技术网

C# StreamWriter正在文件末尾写一行奇怪的代码

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

我使用StreamWriter将字符串写入内存,然后通过ASP.Net Core Web API中的IActionResult将其作为文件返回,我遇到了一个奇怪的问题,在输出文件的末尾出现了一行无法识别的字符

这是我所说的图像:

第513行的文字不应该在那里。。。我认为这与编码有关,但我对编码或文本知之甚少,所以我希望有更多知识的人能帮忙

这是我的密码:

    [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()
,并查看它们的大小。然后查看内存流的
长度
容量
属性。您将看到一个模式。