Не удается получить доступ к закрытому потоку

#c# #stream #thread-safety #networkstream

#c# #поток #безопасность потоков #networkstream

Вопрос:

Я использую Taglib для изменения некоторых тегов в памяти, я пытаюсь прочитать файл с помощью потока, скопировать поток в MemoryStream, внести некоторые изменения, т.Е. (file.Tag.Comment = «мои новые комментарии»), а затем использовать последний поток для загрузки. Вот мой код:

 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();
}
 

Я продолжаю получать сообщение «Не удается получить доступ к закрытому потоку».

файл.Сохранить();

Моя 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();
        }
    }

}
 

Для потока записи / чтения я не уверен, какой код я должен туда поместить, так что это может быть неправильно?

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

Спасибо

Комментарии:

1. Опубликуйте трассировку стека исключения.

2. Разобрался, проблема была здесь: public void CloseStream(Stream stream) { stream . Close(); // Я удалил это, и это сработало }