Я использую zlib для c ++.
Цитата из
http://refspecs.linuxbase.org/LSB_3.0.0/LSB-PDA/LSB-PDA/zlib-gzwrite-1.html относительно gzwrite
функции:
Функция gzwrite()
должна записывать данные в сжатый файл со ссылкой file
, который должен быть открыт в режиме записи (см. gzopen()
и gzdopen()
). При вводе buf
должен указывать на буфер, содержащий len
байтов несжатых данных. Функция gzwrite()
должна сжать эти данные и записать их в файл. Функция gzwrite()
возвращает количество фактически записанных несжатых байтов.
Я интерпретирую это, поскольку возвращаемое значение НЕ скажет мне, насколько больше размер файла при записи Только сколько данных было сжато в файл.
Единственный способ узнать размер файла - закрыть его и прочитать размер из файловой системы. У меня есть требование только продолжать запись в файл, пока он не достигнет определенного размера. Можно ли этого достичь, не закрывая файл?
Обходным решением будет запись до тех пор, пока размер несжатого файла не достигнет моего предела, а затем закройте файл, прочитайте размер из файловой системы и обновите мое лучшее предположение о размере файла, основываясь на этом, а затем повторно откройте файл и продолжите запись , Это заставило бы меня закрыть и открыть файл несколько раз ближе к концу (так как я приближался к предельному размеру).
Другой обходной путь, который дал бы больше оценки (что на самом деле не то, что я хочу), - это запись до тех пор, пока размер несжатого файла не достигнет предела, закрытие файла, чтение размера файла из файловой системы и вычисление степени сжатия. до сих пор. Я могу использовать этот коэффициент сжатия, чтобы вычислить новый предел для размера несжатого файла, где сжатие должно привести меня к пределу для размера сжатого файла. Если я повторю это, оценка улучшится, но, опять же, не то, что я ищу.
Есть ли лучшие варианты?
Предпочтительным вариантом будет, если zlib может сообщить мне размер сжатого файла, пока файл еще открыт. Я не понимаю, почему эта информация не будет доступна внутри zlib на данный момент, так как сжатие происходит, когда я вызываю gzwrite, а не когда я закрываю файл.