Преобразование потока в FileStream в С#

Каков наилучший способ преобразования потока в FileStream с помощью С#.

Функция, над которой я работаю, имеет поток, переданный ему, содержащий загруженные данные, и мне нужно иметь возможность выполнять методы stream.Read(), stream.Seek(), которые являются методами типа FileStream.

Простая трансляция не работает, поэтому я прошу здесь о помощи.

Ответ 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.

Если вы действительно хотите записать в файловую систему, вы можете сделать что-то подобное, которое сначала записывается в файл, а затем перематывает поток... но тогда вам нужно будет позаботиться о его удалении впоследствии, чтобы избежать засорения вашего диск с файлами.