Spec-Zone.ru › Ruby 2.4

класс Zlib::GzipWriter

Родитель:
Zlib::GzipFile

Zlib::GzipWriter — это класс для записи сжатых файлов gzip. GzipWriter должен использоваться с экземпляром объекта IO или объекта, подобного IO.

Следующие два примера генерируют один и тот же результат.

Zlib::GzipWriter.open('hoge.gz') do |gz|
  gz.write 'jugemu jugemu gokou no surikire...'
end

File.open('hoge.gz', 'w') do |f|
  gz = Zlib::GzipWriter.new(f)
  gz.write 'jugemu jugemu gokou no surikire...'
  gz.close
end

Чтобы получить тот же результат, что и gzip(1), выполните следующее:

orig = 'hoge.txt'
Zlib::GzipWriter.open('hoge.gz') do |gz|
  gz.mtime = File.mtime(orig)
  gz.orig_name = orig
  gz.write IO.binread(orig)
end

ПРИМЕЧАНИЕ: из-за ограничений финализатора Ruby, вы должны явно закрывать объекты GzipWriter с помощью Zlib::GzipFile#close и т.п. В противном случае GzipWriter не сможет записать gzip-футер и сгенерирует поврежденный gzip-файл.

Публичные методы класса

Zlib::GzipWriter.new(io, level = nil, strategy = nil, options = {}) Показать исходный код
static VALUE
rb_gzwriter_initialize(int argc, VALUE *argv, VALUE obj)
{
    struct gzfile *gz;
    VALUE io, level, strategy, opt = Qnil;
    int err;

    if (argc > 1) {
        opt = rb_check_convert_type(argv[argc-1], T_HASH, "Hash", "to_hash");
        if (!NIL_P(opt)) argc--;
    }

    rb_scan_args(argc, argv, "12", &io, &level, &strategy);
    TypedData_Get_Struct(obj, struct gzfile, &gzfile_data_type, gz);

    /* this is undocumented feature of zlib */
    gz->level = ARG_LEVEL(level);
    err = deflateInit2(&gz->z.stream, gz->level, Z_DEFLATED,
                       -MAX_WBITS, DEF_MEM_LEVEL, ARG_STRATEGY(strategy));
    if (err != Z_OK) {
        raise_zlib_error(err, gz->z.stream.msg);
    }
    gz->io = io;
    ZSTREAM_READY(&gz->z);
    rb_gzfile_ecopts(gz, opt);

    if (rb_respond_to(io, id_path)) {
        gz->path = rb_funcall(gz->io, id_path, 0);
        rb_define_singleton_method(obj, "path", rb_gzfile_path, 0);
    }

    return obj;
}

Создаёт объект GzipWriter, связанный с io. level и strategy должны быть такими же, как аргументы метода Zlib::Deflate.new. Объект GzipWriter записывает сжатые данные в io. io должен отвечать на метод write, который ведет себя так же, как метод IO#write.

Хэш options может использоваться для установки кодировки данных. :external_encoding, :internal_encoding и :encoding могут быть настроены так же, как и в IO.new.

Zlib::GzipWriter.open(filename, level=nil, strategy=nil) { |gz| ... } Показать исходный код
static VALUE
rb_gzwriter_s_open(int argc, VALUE *argv, VALUE klass)
{
    return gzfile_s_open(argc, argv, klass, "wb");
}

Открывает файл, указанный в filename, для записи сжатых данных gzip и возвращает объект GzipWriter, связанный с этим файлом. Более подробные сведения об этом методе можно найти в ::new и Zlib::GzipFile.wrap.

Публичные методы экземпляра

<<(p1) Показать исходный код
#define rb_gzwriter_addstr  rb_io_addstr

Метод документации: << Аналогичен методу IO.

comment=(p1) Показать исходный код
static VALUE
rb_gzfile_set_comment(VALUE obj, VALUE str)
{
    struct gzfile *gz = get_gzfile(obj);
    VALUE s;
    char *p;

    if (gz->z.flags & GZFILE_FLAG_HEADER_FINISHED) {
        rb_raise(cGzError, "header is already written");
    }
    s = rb_str_dup(rb_str_to_str(str));
    p = memchr(RSTRING_PTR(s), '\0', RSTRING_LEN(s));
    if (p) {
        rb_str_resize(s, p - RSTRING_PTR(s));
    }
    gz->comment = s;
    return str;
}

Устанавливает комментарий (str) в gzip-заголовке.

flush(flush=nil) Показать исходный код
static VALUE
rb_gzwriter_flush(int argc, VALUE *argv, VALUE obj)
{
    struct gzfile *gz = get_gzfile(obj);
    VALUE v_flush;
    int flush;

    rb_scan_args(argc, argv, "01", &v_flush);

    flush = FIXNUMARG(v_flush, Z_SYNC_FLUSH);
    if (flush != Z_NO_FLUSH) {  /* prevent Z_BUF_ERROR */
        zstream_run(&gz->z, (Bytef*)"", 0, flush);
    }

    gzfile_write_raw(gz);
    if (rb_respond_to(gz->io, id_flush)) {
        rb_funcall(gz->io, id_flush, 0);
    }
    return obj;
}

Очищает все внутренние буферы объекта GzipWriter. Значение flush аналогично значению в Zlib::Deflate#deflate. Zlib::SYNC_FLUSH используется, если flush опущено. Не имеет смысла передавать параметр flush Zlib::NO_FLUSH.

mtime=(p1) Показать исходный код
static VALUE
rb_gzfile_set_mtime(VALUE obj, VALUE mtime)
{
    struct gzfile *gz = get_gzfile(obj);
    VALUE val;

    if (gz->z.flags & GZFILE_FLAG_HEADER_FINISHED) {
        rb_raise(cGzError, "header is already written");
    }

    val = rb_Integer(mtime);
    gz->mtime = NUM2UINT(val);

    return mtime;
}

Устанавливает время изменения (mtime) в gzip-заголовке. Используйте целое число (Integer).

Установка времени изменения в gzip-заголовке не влияет на время изменения сгенерированного файла. Разные утилиты, которые распаковывают gzip-файлы, могут использовать заголовок с временем изменения. Например, утилита gunzip может использовать флаг `-N`, который установит время изменения результирующего файла в значение из заголовка. По умолчанию многие инструменты установят время изменения распакованного файла в соответствии с временем изменения сжатого файла, а не времени изменения в заголовке.

Если время изменения не установлено, будет использоваться значение по умолчанию — время начала сжатия. Установка значения 0 указывает, что время не доступно.

orig_name=(p1) Показать исходный код
static VALUE
rb_gzfile_set_orig_name(VALUE obj, VALUE str)
{
    struct gzfile *gz = get_gzfile(obj);
    VALUE s;
    char *p;

    if (gz->z.flags & GZFILE_FLAG_HEADER_FINISHED) {
        rb_raise(cGzError, "header is already written");
    }
    s = rb_str_dup(rb_str_to_str(str));
    p = memchr(RSTRING_PTR(s), '\0', RSTRING_LEN(s));
    if (p) {
        rb_str_resize(s, p - RSTRING_PTR(s));
    }
    gz->orig_name = s;
    return str;
}

Устанавливает имя оригинала (str) в gzip-заголовке.

pos() Показать исходный код
static VALUE
rb_gzfile_total_in(VALUE obj)
{
    return rb_uint2inum(get_gzfile(obj)->z.stream.total_in);
}

Общее количество считанных входных байтов.

print(*args) Показать исходный код
#define rb_gzwriter_print  rb_io_print

Аналогично методу IO.

printf(*args) Показать исходный код
#define rb_gzwriter_printf  rb_io_printf

Аналогично методу IO.

putc(p1) Показать исходный код
static VALUE
rb_gzwriter_putc(VALUE obj, VALUE ch)
{
    struct gzfile *gz = get_gzfile(obj);
    char c = NUM2CHR(ch);

    gzfile_write(gz, (Bytef*)&c, 1);
    return ch;
}

Аналогично методу IO.

puts(*args) Показать исходный код
#define rb_gzwriter_puts  rb_io_puts

Аналогично методу IO.

tell() Показать исходный код
static VALUE
rb_gzfile_total_in(VALUE obj)
{
    return rb_uint2inum(get_gzfile(obj)->z.stream.total_in);
}

Общее количество считанных входных байтов.

write(p1) Показать исходный код
static VALUE
rb_gzwriter_write(VALUE obj, VALUE str)
{
    struct gzfile *gz = get_gzfile(obj);

    if (!RB_TYPE_P(str, T_STRING))
        str = rb_obj_as_string(str);
    if (gz->enc2 && gz->enc2 != rb_ascii8bit_encoding()) {
        str = rb_str_conv_enc(str, rb_enc_get(str), gz->enc2);
    }
    gzfile_write(gz, (Bytef*)RSTRING_PTR(str), RSTRING_LEN(str));
    RB_GC_GUARD(str);
    return INT2FIX(RSTRING_LEN(str));
}

Аналогично методу IO.

Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API