写入 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() 方法的 link。
第二次编辑:这是一段不起作用的代码:
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
的默认行为是,当它被处置时,它也会处置流。
你不能在处理 MemoryStream 时读取它,但你可以调用 ToArray()
。
byte[] result;
using (MemoryStream ms2 = new MemoryStream())
{
mid.Write(ms2);
result = ms2.ToArray();
}
我正在使用 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() 方法的 link。
第二次编辑:这是一段不起作用的代码:
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
的默认行为是,当它被处置时,它也会处置流。
你不能在处理 MemoryStream 时读取它,但你可以调用 ToArray()
。
byte[] result;
using (MemoryStream ms2 = new MemoryStream())
{
mid.Write(ms2);
result = ms2.ToArray();
}