Создание частичного (или ограниченного) FileStream в C # - PullRequest
9 голосов
/ 13 июня 2011

У меня есть FileStream, который состоит из нескольких файлов, помещенных в один файл, и у меня есть список длин файлов, другими словами, я могу легко рассчитать положение и длину всех файлов.Я хочу создать метод Open, который принимает индекс файла и возвращает поток, содержащий только этот файл.В настоящее время я реализовал это, используя поток памяти, но это заставляет меня копировать весь (не контейнер, а весь содержащийся) файл в память, и я не хочу этого делать.Итак, я хотел бы иметь возможность создать класс, который реализует поток и принимает другой поток, параметр смещения и длины, а затем доступен для чтения и поиска, только когда вы выполняете Seek (0), вы должны получить смещениележащего в основе потока.Так как в классе адаптеров, и мне было интересно, возможно ли это, или даже хорошая идея, или у кого-нибудь есть лучшие идеи, как решить эту проблему.Я понимаю, что если я делаю это так, как я только что описал, мне нужно убедиться, что доступ к нижележащему потоку синхронизирован, и что все открытые частичные потоки содержат закрытую переменную, сообщающую им, где они находятся в текущем потоке, но этовероятно, должно быть dooable, верно?кто-нибудь делал что-то подобное раньше?Или есть симпел .NET-класс, который я могу просто использовать?Буду признателен за любую помощь.

Ой, и извините за плохой английский, я забыл установить свой браузер на английском, поэтому проверка орфографии говорит мне, что все не так.

1 Ответ

2 голосов
/ 13 июня 2011

Если вы используете .NET 4.0, вы можете использовать сопоставленные с памятью файлы .Они в значительной степени выполняют то, что вы описали: вы можете отобразить «представление» большого файла, указанного смещением и длиной, в память и получить доступ только к этой части файла, используя Stream.

В противном случае, я думаю, ваш подход звучит хорошо.Просто следите за угловыми случаями, включающими чтение или запись за пределы предполагаемого файла!

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