类 Zlib::GzipFile

Zlib::GzipFile 是一个用于处理 gzip 格式压缩文件的抽象类。操作在子类中定义,Zlib::GzipReader 用于读取,Zlib::GzipWriter 用于写入。

GzipReader 应通过关联一个 IO 或类似 IO 的对象来使用。

Method 目录

(由于内部结构,文档可能出现在 Zlib::GzipReaderZlib::GzipWriter 下)

公共类方法

Zlib::GzipReader.wrap(io, ...) { |gz| ... } 点击切换源代码
Zlib::GzipWriter.wrap(io, ...) { |gz| ... }

创建一个与 io 关联的 GzipReaderGzipWriter,传入任何必要的额外选项,并使用新创建的对象执行块,就像 File.open 一样。

在执行代码块后,GzipFile 对象会自动关闭。如果您想保持关联的 IO 对象打开,您可以在代码块中调用 Zlib::GzipFile#finish 方法。

static VALUE
rb_gzfile_s_wrap(int argc, VALUE *argv, VALUE klass)
{
    return gzfile_wrap(argc, argv, klass, 0);
}

公共实例方法

close() 点击切换源代码

关闭 GzipFile 对象。此方法调用关联的 IO 对象的 close 方法。返回关联的 IO 对象。

static VALUE
rb_gzfile_close(VALUE obj)
{
    struct gzfile *gz;
    VALUE io;

    TypedData_Get_Struct(obj, struct gzfile, &gzfile_data_type, gz);
    if (!ZSTREAM_IS_READY(&gz->z)) {
        return Qnil;
    }
    io = gz->io;
    gzfile_close(gz, 1);
    return io;
}
closed?() 点击切换源代码

IO#closed? 相同。

static VALUE
rb_gzfile_closed_p(VALUE obj)
{
    struct gzfile *gz;
    TypedData_Get_Struct(obj, struct gzfile, &gzfile_data_type, gz);
    return NIL_P(gz->io) ? Qtrue : Qfalse;
}
comment() 点击切换源代码

返回 gzip 文件头中记录的注释,如果注释不存在则返回 nil。

static VALUE
rb_gzfile_comment(VALUE obj)
{
    VALUE str = get_gzfile(obj)->comment;
    if (!NIL_P(str)) {
        str = rb_str_dup(str);
    }
    return str;
}
crc() 点击切换源代码

返回未压缩数据的 CRC 值。

static VALUE
rb_gzfile_crc(VALUE obj)
{
    return rb_uint2inum(get_gzfile(obj)->crc);
}
finish() 点击切换源代码

关闭 GzipFile 对象。与 Zlib::GzipFile#close 不同,此方法永远不会调用关联的 IO 对象的 close 方法。返回关联的 IO 对象。

static VALUE
rb_gzfile_finish(VALUE obj)
{
    struct gzfile *gz = get_gzfile(obj);
    VALUE io;

    io = gz->io;
    gzfile_close(gz, 0);
    return io;
}
level() 点击切换源代码

返回压缩级别。

static VALUE
rb_gzfile_level(VALUE obj)
{
    return INT2FIX(get_gzfile(obj)->level);
}
mtime() 点击切换源代码

返回 gzip 文件头中记录的最后修改时间。

static VALUE
rb_gzfile_mtime(VALUE obj)
{
    return rb_time_new(get_gzfile(obj)->mtime, (time_t)0);
}
orig_name() 点击切换源代码

返回 gzip 文件头中记录的原始文件名,如果原始文件名不存在则返回 nil

static VALUE
rb_gzfile_orig_name(VALUE obj)
{
    VALUE str = get_gzfile(obj)->orig_name;
    if (!NIL_P(str)) {
        str = rb_str_dup(str);
    }
    return str;
}
os_code() 点击切换源代码

返回 gzip 文件头中记录的操作系统代码编号。

static VALUE
rb_gzfile_os_code(VALUE obj)
{
    return INT2FIX(get_gzfile(obj)->os_code);
}
sync() 点击切换源代码

IO#sync 相同。

static VALUE
rb_gzfile_sync(VALUE obj)
{
    return (get_gzfile(obj)->z.flags & GZFILE_FLAG_SYNC) ? Qtrue : Qfalse;
}
sync = flag 点击切换源代码

IO 相同。如果标志为 true,则关联的 IO 对象必须响应 flush 方法。当 sync 模式为 true 时,压缩率会急剧下降。

static VALUE
rb_gzfile_set_sync(VALUE obj, VALUE mode)
{
    struct gzfile *gz = get_gzfile(obj);

    if (RTEST(mode)) {
        gz->z.flags |= GZFILE_FLAG_SYNC;
    }
    else {
        gz->z.flags &= ~GZFILE_FLAG_SYNC;
    }
    return mode;
}
to_io() 点击切换源代码

IO 相同。

static VALUE
rb_gzfile_to_io(VALUE obj)
{
    return get_gzfile(obj)->io;
}