繁体   English   中英

写入MemoryStream无法按预期工作

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM