Можно ли клонировать поток .NET? - PullRequest
18 голосов
/ 22 марта 2010

Можем ли мы клонировать поток?

Ответы [ 3 ]

14 голосов
/ 22 марта 2010

Нет, потоки обычно ссылаются на локальные ресурсы определенного типа (сокет, дескриптор файла и т. Д.), Поэтому их нельзя клонировать или сериализовать.Кроме того, многие потоки предназначены только для пересылки и не поддерживают поиск, поэтому вы даже не сможете перечитать из потока.

Что вы можете сделать из читаемого потока, это скопировать его в MemoryStream, который можетперемещаться как байтовый массив.

В следующем посте приведен фрагмент кода, показывающий, как это сделать: Как скопировать содержимое одного потока в другой?

public static void CopyStream(Stream input, Stream output)
{
    byte[] buffer = new byte[32768];
    while (true)
    {
        int read = input.Read (buffer, 0, buffer.Length);
        if (read <= 0)
            return;
        output.Write (buffer, 0, read);
    }
}
3 голосов
/ 22 марта 2010

Нет. Клонирование не является обычно поддерживаемой операцией для класса Stream. Чтобы это было так, он должен охватывать все возможные реализации класса Stream.

Это может быть выполнимо для таких предметов, как FileStream, но подумайте, что это будет означать для, скажем, NetworkStream. Клонирование обычно имеет концепцию создания совершенно отдельных объектов, которые идентичны на момент создания. Это обычно не выполнимо для таких элементов, как TCP-соединения, которые на некотором уровне обычно заключены в NetworkStream.

1 голос
/ 22 марта 2010

Нет, вы не можете клонировать общий поток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...