Mowgli
|
Posted: Sat Jun 27, 2009 04:11 Post subject: |
|
|
Quote: | Весьма странное утверждение. Поскольку кирпич является частью здания нельзя описывать свойства кирпича не описав свойств здания в целом? | Аналогии=) Люблю аналогии. Вот ещё одна: как понять назначение колеса, если нет телеги?
Quote: | Это, конечно, неточность | Это высказывание носит весьма категоричный характер и поначалу меня весьма сбило с толку.
Quote: | Мне просто любопытно стало - а для каких архивов ты пишешь плагин? Ну и возник ряд других вопросов. Может ли количество файлов в твоём архиве достигать сотен тысяч или миллионов? Если да, то сколько памяти потребуется при вызове функции OpenArchive? Сколько времени ты будешь составлять этот список если архивный файл лежит на сетевом ресурсе? |
Для архивов одной игры. Архивы сами по себе немаленькие, но сам индекс файлов в них небольшой. Файлов не больше десятка тысяч. Потребная память под список файлов - мегабайта два, около того.
Мне проще составлять список файлов внутри конструктора моего класса, тем более, что я этот же класс потом использую для распаковки.
Если файлов много, да ещё и архивы в сети, то само-собой такой подход (с чтением всего при открытии) не пройдёт. Мой пример был иллюстрацией, для того чтобы абстракции привязать к чему-то реальному.
Quote: | Дальнейшая навигация внутри архива и повторные заходы в этот архив могут осуществляться без участия плагина. |
Вот это я хотел бы понять. В каком случае TC захочет перечитать заново содержимое архива? Если архив не менялся, то зачем ему это может потребоваться? И наконец, какова может быть роль плагина в навигации внутри архива?
Quote: | Mowgli wrote: | но учитывая, что деструкторы исключений не вызывают | С чего бы это? Попробуй в деструкторе разделить что-то на 0. |
Поправлюсь слегка. Правильно написанные деструкторы исключений вызывать не должны. В противном случае они нарушают спецификацию языка C++. Это в общем и целом вполне выполнимое требование, хотя, как было замечено, сделать можно всё, что угодно.
Quote: | Если хочется можно и проверять, но проще конкатенировать две строки и двигаться дальше. |
Если бы DestPath был пустой строкой, то да. А так он NULL. Всё равно проверять надо.
Quote: | "Узнавать" - это сильное выражение в данном контексте. ТС передает тебе hArcData, который ассоциирован тобой же с текущим файлом. Так что эта фраза звучит примерно как "У меня есть адрес строки. Теперь мне самостоятельно придётся узнать что это за строка".  |
Для начала hArcData - это ещё не текущий файл в архиве. Из него ещё надо список файлов получить. Для этого возможно требуются немалые затраты, как было справедливо замечено выше. И это при том, что мы эту работу уже один раз проделали, и TC уже имеет этот список. Я конечно понимаю, что одного только имени может не хватить, чтобы найти этот файл в архиве и извлечь, но вот в моём случае этого как раз достаточно. Что стоило в случае повторного обхода для распаковки передавать мне обратно в структуре HeaderData при вызове ReadHeader ту информацию, что плагин ранее отдал TC?
Впрочем, вопрос не стоит обсуждения. Я то просто хотел понять как это работает. Если именно так, значит с этим и буду жить =)
Quote: | Quote: | Расчёт очевидно идёт на то, что обход файлов осуществляется строго в том же порядке, что и при получении списка файлов. | Это в некотором смысле тавтология. Обход файлов и получение списка это одно и то же. |
Ещё раз. Я имел в виду два обхода. Первый был выполнен при построении списка файлов с опцией PK_OM_LIST. На основе этого цикла TC построил список файлов. Затем для распаковки был запущен второй цикл с опций PK_OM_EXTRACT. При этом TC очевидно полагается на то, что список файлов вторично построенный плагином и его, сохранённый ранее, будут в точности совпадать. Если они не будут совпадать, то начнутся большие проблемы. Ведь TC не передаёт при очередной итерации имя файлов для распаковки, только путь назначения. И если взаимный порядок файлов у TC и у плагина нарушается, то как плагин сможет узнать, что он распаковывает нужный файл?
Для меня сейчас важно понять, правильно ли я понимаю логику работы всей системы. Мне это надо, чтобы продолжить работу над плагином. |
|