首页 > 解决方案 > 写入 MemoryStream 未按预期工作

问题描述

我正在使用DryWetMidi库来处理一些 MIDI 数据。

首先,我从剪贴板获取 MIDI 数据作为 MemoryStream:

MemoryStream ms = (MemoryStream)Clipboard.GetDataObject().GetData("Standard MIDI File");
MidiFile mid = MidiFile.Read(ms);

然后我用 midi 做一些事情:

mid.RemoveNotes(n => n.NoteName == NoteName.FSharp);

现在我想把它写回剪贴板。我设法这样做:

using (FileStream file = new FileStream("file.mid", FileMode.Create, FileAccess. 
{
   mid.Write(file);
}


using (MemoryStream ms2 = new MemoryStream())
using (FileStream file = new FileStream("file.mid", FileMode.Open, FileAccess.Read))
{
     byte[] bytes = new byte[file.Length];
     file.Read(bytes, 0, (int)file.Length);
     ms2.Write(bytes, 0, (int)file.Length);

     Clipboard.Clear();
     Clipboard.SetData(midiFormat, ms2);
}

File.Delete("file.mid");

如您所见,首先我将 MIDI 写入文件,然后将该文件读入 MemoryStream,然后将其写入剪贴板。这没有多大意义,因为直接将其写入 MemoryStream 会更简单。另外,我不想将文件写入用户文件系统。但是问题就来了。我试过这样:

using (MemoryStream ms2 = new MemoryStream())
{
    mid.Write(ms2);
}

这不会给我一个错误,但 MemoryStream 完全是空的。调用 ms2.Length 会产生一个System.ObjectDisposedException.

如何将 midi 直接写入 MemoryStream?

编辑:这是 DryWetMidi Write()方法的链接。

第二次编辑:这是一段不起作用的代码:

MemoryStream ms = (MemoryStream)Clipboard.GetDataObject().GetData(midiFormat);

MidiFile mid = MidiFile.Read(ms);
mid.RemoveNotes(n => n.NoteName == NoteName.FSharp);


MemoryStream ms2 = new MemoryStream();
mid.Write(ms2);
var T = ms2.Length; //This will throw an exception

第三次编辑:我 100% 确定发布的代码与我正在运行的代码完全相同。这是StackTrace。(要点是因为格式化在 SO 上很糟糕)。

标签: c#streammidi

解决方案


据我所知,DryWetMidi 用于BinaryWriter写入流。的默认行为BinaryWriter是,当它被释放时,它也会释放流。

当 MemoryStream 被处理时,您无法读取它,但您可以调用ToArray().

byte[] result;
using (MemoryStream ms2 = new MemoryStream())
{
    mid.Write(ms2);
    result = ms2.ToArray();
}

推荐阅读