[英]Writing to MemoryStream not working as expected
我正在使用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上很糟糕)。
据我所知,DryWetMidi使用BinaryWriter
写入流。 而BinaryWriter
的默认行为是,当它被BinaryWriter
时,它也会处理流。
您可以在处理时从MemoryStream中读取,但可以调用ToArray()
。
byte[] result;
using (MemoryStream ms2 = new MemoryStream())
{
mid.Write(ms2);
result = ms2.ToArray();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.