Я использую Taglib для изменения некоторых тегов в памяти, я пытаюсь сделать это, прочитав файл с помощью потока, скопировать поток в memoryStream и внести некоторые изменения, например (file.Tag.Comment = "my New comments"),а затем использовать последний поток для загрузки.Вот мой код:
Stream fileStream = null;
// Buffer To Read 10K Bytes In Chunk:
Byte[] Buffer = new Byte[10000];
// Length Of The File:
int Length;
// Identify The File To Download Including Its Path.
System.IO.FileInfo fileInfo = new System.IO.FileInfo(@"c:\123.mp3");
string fn = fileInfo.FullName;
try
{
fileStream = new System.IO.FileStream(fn, System.IO.FileMode.Open, System.IO.FileAccess.Read);
// Copy the Stream to a MemoryStream
MemoryStream storeStream = new MemoryStream();
storeStream.SetLength(fileStream.Length);
fileStream.Read(storeStream.GetBuffer(), 0, (int)fileStream.Length);
var streamFileAbstraction = new StreamFileAbstraction(fileStream, fn, storeStream);
using (var file = TagLib.File.Create(streamFileAbstraction))
{
file.Tag.Comment = "my New comments";
file.Save();
}
Я получаю сообщение «Не удается получить доступ к закрытому потоку».
file.Save ();
Мой StreamFileAbstraction выглядит следующим образом:
public class StreamFileAbstraction : TagLib.File.IFileAbstraction
{
private string name;
private Stream thefile;
private MemoryStream memStream;
public StreamFileAbstraction(Stream file, String filename, MemoryStream ms)
{
name = filename;
thefile = file;
memStream = ms;
}
public void CloseStream(Stream stream)
{
stream.Close();
}
public string Name
{
get { return name; }
}
public Stream ReadStream
{
get { return memStream; }
}
public Stream WriteStream
{
get
{
byte[] buffer = ReadFully(memStream); //.ReadAllBytes(memStream.Length.ToString());
MemoryStream ms2 = new MemoryStream();
//return new MemoryStream(buffer, 0, buffer.Length);
//return new FileStream(Name, FileMode.Open, System.IO.FileAccess.Write);
//return new MemoryStream(buffer, true /*writable*/);
return new MemoryStream();
}
}
public Stream Thefile
{
get { return thefile; }
}
public byte[] ReadFully(Stream stream)
{
using (MemoryStream memoryStream = new MemoryStream())
{
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
{
memoryStream.Write(buffer, 0, bytesRead);
}
return memoryStream.ToArray();
}
}
}
Для WriteStream / ReadStream я не уверен, какой код я должен поместить тудатак что это может быть не так?
Очень хотел бы услышать от вас.
спасибо