Преобразовать поток в FileStream в C # - PullRequest
13 голосов
/ 22 сентября 2010

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

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

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

1 Ответ

20 голосов
/ 22 сентября 2010

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's content
    }
}

Это похоже на использование метода Stream.CopyTo, представленного в .NET 4.

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

...