Ответ 1
Read
и Seek
являются методами типа Stream
, а не только FileStream
. Просто это не каждый поток поддерживает их. (Лично я предпочитаю использовать Position
свойство при вызове Seek
, но они сводятся к одному и тому же.)
Если вы предпочтете иметь данные в памяти для сброса их в файл, почему бы просто не прочитать все это в MemoryStream
? Это поддерживает поиск. Например:
public static MemoryStream CopyToMemory(Stream input)
{
// It won't matter if we throw an exception during this method;
// we don't *really* need to dispose of the MemoryStream, and the
// caller should dispose of the input stream
MemoryStream ret = new MemoryStream();
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0)
{
ret.Write(buffer, 0, bytesRead);
}
// Rewind ready for reading (typical scenario)
ret.Position = 0;
return ret;
}
Использование:
using (Stream input = ...)
{
using (Stream memory = CopyToMemory(input))
{
// Seek around in memory to your heart content
}
}
Это похоже на использование метода Stream.CopyTo
, представленного в .NET 4.
Если вы действительно хотите записать в файловую систему, вы можете сделать что-то подобное, которое сначала записывается в файл, а затем перематывает поток... но тогда вам нужно будет позаботиться о его удалении впоследствии, чтобы избежать засорения вашего диск с файлами.