#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(); // Я удалил это, и это сработало }