Не удается получить доступ к закрытому потоку - PullRequest
0 голосов
/ 01 ноября 2011

Я использую 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 я не уверен, какой код я должен поместить тудатак что это может быть не так?

Очень хотел бы услышать от вас.

спасибо

...