C# 将音频从文件写入memorystream

C# 将音频从文件写入memorystream,c#,memorystream,C#,Memorystream,我试图将此文件发送到outputstream,但无法理解为什么它基本上是一个空的mp3文件。正如您所看到的,我会得到一个异常,过早地关闭流,所以我现在已经注释掉了。欢迎指点 using (FileStream mp3file = File.OpenRead(newFile)) { context.Response.AddHeader("content-transfer-encoding", "binary");

我试图将此文件发送到outputstream,但无法理解为什么它基本上是一个空的mp3文件。正如您所看到的,我会得到一个异常,过早地关闭流,所以我现在已经注释掉了。欢迎指点

using (FileStream mp3file = File.OpenRead(newFile))
                {
                    context.Response.AddHeader("content-transfer-encoding", "binary");
                    context.Response.ContentType = "audio/mpeg";
                    MemoryStream memStream = new MemoryStream();
                    byte[] bytes = new byte[mp3file.Length];
                    memStream.SetLength(mp3file.Length);
                    mp3file.Read(memStream.GetBuffer(), 0, (int)mp3file.Length);
                    memStream.Write(bytes, 0, (int)mp3file.Length);
                    //mp3file.Close();
                    memStream.WriteTo(context.Response.OutputStream);
                    //memStream.Close();

                }

这部分就是问题所在:

 byte[] bytes = new byte[mp3file.Length];
 ...
 // Here you're reading into the memory stream buffer...
 mp3file.Read(memStream.GetBuffer(), 0, (int)mp3file.Length);
 // And here you're overwriting it with the byte array full of zeroes!
 memStream.Write(bytes, 0, (int)mp3file.Length);
不过,您不应该假设对
Read
的单个调用实际上会读取所有内容。目前还不清楚您使用的是.NET的哪个版本,但如果您使用的是.NET 4或更高版本,您可以使用它使其更简单

还不清楚为什么要使用
MemoryStream
。为什么不直接复制到输出流呢

mp3File.CopyTo(context.Response.OutputStream);
或者,如果您使用的是较旧版本的.NET:

byte[] buffer = new byte[16 * 1024]; // For exmaple...
int bytesRead;
while ((bytesRead = mp3File.Read(buffer, 0, buffer.Length)) > 0)
{
    context.Response.OutputStream.Write(buffer, 0, bytesRead);
}

(这相当于
CopyTo

这部分就是问题所在:

 byte[] bytes = new byte[mp3file.Length];
 ...
 // Here you're reading into the memory stream buffer...
 mp3file.Read(memStream.GetBuffer(), 0, (int)mp3file.Length);
 // And here you're overwriting it with the byte array full of zeroes!
 memStream.Write(bytes, 0, (int)mp3file.Length);
不过,您不应该假设对
Read
的单个调用实际上会读取所有内容。目前还不清楚您使用的是.NET的哪个版本,但如果您使用的是.NET 4或更高版本,您可以使用它使其更简单

还不清楚为什么要使用
MemoryStream
。为什么不直接复制到输出流呢

mp3File.CopyTo(context.Response.OutputStream);
或者,如果您使用的是较旧版本的.NET:

byte[] buffer = new byte[16 * 1024]; // For exmaple...
int bytesRead;
while ((bytesRead = mp3File.Read(buffer, 0, buffer.Length)) > 0)
{
    context.Response.OutputStream.Write(buffer, 0, bytesRead);
}

(这相当于
CopyTo

谢谢。我假设如果我删除了
memStream.Write(字节,0,(int)mp3file.Length)它可以工作但没有DIC。这是.NET4。作为一个高效代码的开发者和一个.net的noob,我在尝试实现你的建议时有点困惑。以下是我尝试的:
byte[]bytes=新字节[mp3file.Length];读取(字节,0,(int)mp3file.Length);mp3file.CopyTo(context.Response.OutputStream)没有快乐。我真的很想自己得到这个,我很感谢你的帮助。@Brimm:那么你已经阅读了所有的数据,所以
CopyTo
不会有帮助。为什么要费心把它读入
字节
?只需使用
CopyTo
?另外,如果你遇到了问题,而且你对.NET还比较陌生,那么停止尝试微优化。先写清楚代码。当您对自己的代码、语言和平台有绝对信心时,如果确实需要,您可以进行优化。这些文件少于10k。我尝试了这个,然后再次使用(FileStream mp3file=file.OpenRead(newFile)){context.Response.AddHeader(“内容传输编码”,“二进制”);context.Response.ContentType=“音频/mpeg”;mp3file.CopyTo(context.Response.OutputStream)清空文件}
结果证明这确实有效。我的构建问题让我发疯。我重启了VS,砰的一声。谢谢谢谢我假设如果我删除了
memStream.Write(字节,0,(int)mp3file.Length)它可以工作但没有DIC。这是.NET4。作为一个高效代码的开发者和一个.net的noob,我在尝试实现你的建议时有点困惑。以下是我尝试的:
byte[]bytes=新字节[mp3file.Length];读取(字节,0,(int)mp3file.Length);mp3file.CopyTo(context.Response.OutputStream)没有快乐。我真的很想自己得到这个,我很感谢你的帮助。@Brimm:那么你已经阅读了所有的数据,所以
CopyTo
不会有帮助。为什么要费心把它读入
字节
?只需使用
CopyTo
?另外,如果你遇到了问题,而且你对.NET还比较陌生,那么停止尝试微优化。先写清楚代码。当您对自己的代码、语言和平台有绝对信心时,如果确实需要,您可以进行优化。这些文件少于10k。我尝试了这个,然后再次使用(FileStream mp3file=file.OpenRead(newFile)){context.Response.AddHeader(“内容传输编码”,“二进制”);context.Response.ContentType=“音频/mpeg”;mp3file.CopyTo(context.Response.OutputStream)清空文件}
结果证明这确实有效。我的构建问题让我发疯。我重启了VS,砰的一声。谢谢